繁体   English   中英

从 MariaDB 的行中提取 varchar 或文本列的多个匹配项

[英]extract multiple matches from varchar or text column as rows from MariaDB

我的数据库中有一个字符串 (varchar) 列,我想使用 SQL 进行一些简单的组匹配并将匹配项提取到行中。 有没有办法在没有存储过程或自定义 function 的 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 '[x][0-9]' OR W.xy_val REGEXP '[y][0-9]'

看演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM