SQL 查询以查找遵循特定模式的字符串

Posted

技术标签:

【中文标题】SQL 查询以查找遵循特定模式的字符串【英文标题】:SQL Query to find string that follows a particular pattern 【发布时间】:2020-06-17 06:20:15 【问题描述】:

我在表中有一个 varchar 列,我需要在该列中找到与模式匹配的所有值。模式是 parta-partb-partcparta-partb-positiveInteger-partc。除了数字部分,一切都是固定的。 例如

**someColumn**

parta-partb-partc
parta-partb-1-partc
parta-partb-1xyz-partc
parta-partb-123-partc
parta-partb-abc-partc

我的搜索查询应该返回

parta-partb-partc
parta-partb-1-partc
parta-partb-123-partc

到目前为止,这是我得到的

 SELECT * 
 FROM tableName 
 WHERE 
      someColumn ='parta-partb-partc' 
   OR someColumn LIKE 'parta-partb-%[0-9]-partc'

我无法构造 LIKE 部分以仅获取介于两者之间的正数字符串。

【问题讨论】:

你使用的是哪个数据库? hsqlserver 用于测试,但可以在生产中使用 sqlserver、oracle 或 mysql 中的任何一个 功能会因数据库而异。如果您能推荐一个合适的数据库,可以为您提供解决方案 我不能确定客户可能使用什么数据库。在这种情况下你有什么建议?我应该通过 someColumn LIKE 'parta-partb-%-partc' 引入值并使用 java 正则表达式过滤掉不需要的值吗? 【参考方案1】:

对于 MySQL,以下查询给出预期结果

SELECT *
FROM
  tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   someColumn REGEXP 'parta-partb-[0-9]+-partc'
;

对于 Oracle,以下查询给出预期结果

SELECT *
FROM tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   REGEXP_LIKE(someColumn, 'parta-partb-[[:digit:]]+-partc')
;

不幸的是,对于 MS-SQL,where 子句不支持 REGEX,因此您必须执行以下操作。 [特定于您的示例数据]

SELECT *
FROM tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   (    someColumn LIKE 'parta-partb-[0-9]-partc'
    OR  someColumn LIKE 'parta-partb-[0-9]%[0-9]-partc'
    AND someColumn NOT LIKE 'parta-partb-[0-9]%[a-zA-Z]%[0-9]-partc'
    AND someColumn NOT LIKE 'parta-partb-[0-9]%[a-zA-Z]-partc'
   )

【讨论】:

以上是关于SQL 查询以查找遵循特定模式的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:查找特定字符串后的所有数字

Sql 查询以查找行中的特定总和

如何让 sql 排名查询工作以查找特定 id 的排名

sql SQL查询SSISDB以查找与特定SSIS包相关的错误消息

从遵循特定模式的列中提取字符串

在字符串列表中查找特定模式(正则表达式)(Python)