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

ergxz8rk  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(132)

我的数据库中有一个字符串(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
是否有方法获得所有匹配项?

qfe3c7zg

qfe3c7zg1#

您可以使用JSON_TABLE提取字符串中的所有单词,然后检查这些单词是否以x或y开头,后面是否跟有数字。
您可以简单地将字符串转换为JSON格式,方法是用方括号将其括起来,用双引号将每个单词括起来,并用逗号替换每个空格。
然后可以按如下方式使用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

相关问题