模式匹配sql中特定长度的字符串

时间:2013-08-02 07:05:56

标签: sql sql-server

我需要查询表中的行,其中一列与一个字符串相匹配,该字符串的定义特征是一个特定长度的字母数字字符串(比如4),后跟一个“:”后跟一个整数。

  • pattern:alphanumericstring:integer
  • example1:1234:someint
  • example2:abcd:someotherint

我尝试了以下

select * from mytable where col1 like '[]{4}:%' 

select * from mytable where col1 like '.{4}:%'

这些都不起作用。我知道我甚至没有尝试确保“:”后面的部分是一个整数。

3 个答案:

答案 0 :(得分:2)

SQL Server不直接支持正则表达式(如果你搜索一下,你可以找到一些通过用户定义的函数添加它们的教程)。

LIKE不支持量词,但它确实有通配符和轻量级字符类。

下划线将匹配任何字符:

SELECT col1
FROM data
WHERE col1 LIKE '____:%';

或者您可以指定要匹配的字符范围:

SELECT col1
FROM data
WHERE col1 LIKE '[a-z0-9][a-z0-9][a-z0-9][a-z0-9]:%';

请参阅这些live on SQLFiddle

要指定第二部分必须仅包含数字,可以使用其他条件:

SELECT col1
FROM data
WHERE col1     LIKE '[a-z0-9][a-z0-9][a-z0-9][a-z0-9]:%'
  AND col1 NOT LIKE '[a-z0-9][a-z0-9][a-z0-9][a-z0-9]:%[^0-9]%';

你可以test the last one live as well

答案 1 :(得分:1)

您可以结合使用charindexsubstringisnumeric

CREATE TABLE MyTable
(
    col1 varchar(20),
    col2 varchar(50)
)

INSERT INTO MyTable
    VALUES 
    ('ABCD:123', 'Value 123'),
    ('1234:1234', 'Value 1234'),
    ('xyz:1234', 'should not be selected'),
    ('cdef:abcd', 'should not be selected too')


SELECT *
FROM MyTable
WHERE CHARINDEX(':', col1, 0) = 5 AND 
      ISNUMERIC(SUBSTRING(col1, CHARINDEX(':', col1) + 1, 20)) = 1

答案 2 :(得分:0)

这很难看,但这应该可以解决正整数的问题:

;WITH test AS (
  SELECT expr = '1234:3421'
  UNION ALL SELECT '1234:25'
  UNION ALL SELECT '1234:xx')
select * 
from test
where 
  expr like '%:[0-9]'
  OR expr like '%:[0-9][0-9]'
  OR expr like '%:[0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  OR expr like '%:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'