sql - 从 varchar 或 text 列中提取多个匹配项作为 MariaDB 中的行

标签 sql mariadb

我的数据库中有一个字符串 (varchar) 列,我想使用 SQL 进行一些简单的组匹配并将匹配项提取到行中。有没有办法在 mariaDB 中使用纯 SQL 来完成此任务,而无需存储过程或自定义函数?

示例:

 my_string ="this is a test string with x12345 and y1264 ...";

我正在寻找类似的东西来提取所有以 x 或 y 开头的数字到行中。

SELECT REGEXP_SUBSTR("[xy][0-9]+") from my_string;

预期结果:

x12345
y1264

我需要这些行的原因是,这将是一个更大查询的一部分,我在另一个表中的键上连接这些行。

我的上述查询仅返回 1 行,即第一个结果 x12345

有没有办法获取所有匹配项?

最佳答案

您可以使用JSON_TABLE提取字符串中的所有单词,然后检查这些单词是否以 x 或 y 开头且后跟数字。

您可以简单地将字符串转换为 JSON 格式,方法是将其用方括号括起来,用双引号将每个单词括起来,然后用逗号替换每个空格。因此,您可以使用此代码来执行此操作 CONCAT('["', REPLACE(myTxt, ' ', '","'), '"]')

然后您可以按如下方式使用 JSON_TABLE:

create table tbl(id int, myTxt TEXT);
insert into tbl values
  (1, 'this is a test string with x12345 and y1264'), 
  (2, 'this is a test xtest ytest string with x11111 and y11111 and x22222 and y22222');


SELECT id,
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY W.rowid) num_order, 
       W.xy_val
FROM tbl
CROSS JOIN JSON_TABLE
  (
    CONCAT('["', REPLACE(myTxt, ' ', '","'), '"]'), 
    '$[*]' 
    COLUMNS 
      (
       rowid FOR ORDINALITY, 
       xy_val VARCHAR(32) PATH '$'
      )
  ) W
WHERE  W.xy_val REGEXP '[xy][0-9]' 

See demo

关于sql - 从 varchar 或 text 列中提取多个匹配项作为 MariaDB 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75198846/

相关文章:

mysql - 如何正确地将 mariadb 数据库从容器移动到主机

mysql - 非常基本的 MySQL 代码无法运行

mysql - WordPress MYSQL 错误

php - 从 mysqli_multi_query 获取最后结果

mysql - Perl 和 XPath : missing entries in database table

java - 通信链路故障 JDBC Java

mysql - 使用mysql计算两个值的差异并根据结果进行排序

sql - 数据库表中的键/值对

sql - 为什么 SQL Server 会误解此 ISO 8601 格式日期?

sql - 如何在 SQL Server 2012 中将 varchar 1,760,862.8185919 转换为 float ?