我的数据库中有一个字符串(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 '[x][0-9]' OR W.xy_val REGEXP '[y][0-9]'

See demo

Sql相关问答推荐

我如何计算字母a出现的字符串的次数?

在请求结束之前,PostgreSQL不会考虑使用中的删除

如何优化我的功能以减少花费的时间?

Oracle SQL根据列中的条件 Select 最大记录数

使用多个嵌套数组查询JSON数据

仅当交叉应用返回单值时才更新记录

如何根据行状态设置正确的标志

Select 列组(按同一表格中的另一列分组)Laravel 10

从类似JSON的字符串列创建新列

通过UPDATE SELECT更新表时出现问题

将SQL Server查询改进为;线程安全;

连续天跟踪购买情况(将标记返回到另一列?)

具有分组条件的不同计数 (DAX)

使用其他表 SUM 的交换价格转换价格并获得 AVG

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

如何更改 duckdb R 中的数据约束

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

在给定列中具有特定值的行与 SQL 中的总行数的比率

在 Snowflake SQL 中计算通货inflating 率

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?