4

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

  • 模式:字母数字字符串:整数
  • 示例 1:1234:someint
  • 示例 2:abcd:someotherint

我尝试了以下

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

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

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

4

3 回答 3

3

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]:%';

在 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]%';

您也可以现场测试最后一个

于 2013-08-02T07:20:20.200 回答
1

您可以使用和charindex的组合substringisnumeric

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
于 2013-08-02T09:52:16.480 回答
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]'
于 2013-08-02T07:21:00.333 回答