mariaDB 仅从 {"user":"128"} 中提取数字

mariaDB extract only the digits from {"user":"128"}

来自字符串 {"user":"128"},只需要 128.

也可以是{"user":"8"}{"user":"12"}{"user":"128798"}

在这个fiddle example中匹配的值应该是3

Schema:

CREATE TABLE test1 (
  id INT AUTO_INCREMENT,
  userid INT(11),
  PRIMARY KEY (id)
);

INSERT INTO test1(userid)
VALUES
('126'),
('2457'),
('3'),
('40');

CREATE TABLE test2 (
  id INT AUTO_INCREMENT,
  code VARCHAR(1024),
  PRIMARY KEY (id)
);

INSERT INTO test2(code)
VALUES
('{"user":"128"}'),
('{"user":"2459"}'),
('{"user":"3"}'),
('{"user":"46"}');

Query:

(SELECT sub.`userid`, rev.`code` REGEXP '[0-9]'
FROM `test1` AS sub, `test2` AS rev
WHERE sub.`userid`= rev.`code` 
)

已经尝试 REGEXP '[0-9]' 并且 '[[:digit:]]' 但没有成功。

我也试过concat ('',value * 1) = valueconcat(value * 1) = value

解决方案:fiddle

如果正则表达式匹配字符串,REGEXP 将 return0 或 1。

你应该看看 'regexp_substr' https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-substr

select REGEXP_SUBSTR(code, '"[0-9]+"') from test2

在您的提琴手中选择 MySQL 8 版本后,这对我有用。 它 returns :

"128"
"2459"
null
"46"

select REGEXP_SUBSTR(code, '[0-9]+') from test2

如果您想要 3 而不是“k3”的 null

akina 建议使用 JSON_EXTRACT 更好,但确实需要您将列重新定义为来自 VARCHAR 的 JSON 数据类型。

使用函数REGEXP_SUBSTR:

MariaDB [(none)]> SELECT  REGEXP_SUBSTR('{"user":"128"}', '\d+');
+-----------------------------------------+
| REGEXP_SUBSTR('{"user":"128"}', '\d+') |
+-----------------------------------------+
| 128                                     |
+-----------------------------------------+
1 row in set (0.000 sec)