获取仅包含特定字符的行

时间:2013-04-03 08:51:25

标签: sql sql-server sql-server-2008 select sql-like

我想只获取那些只包含列中某些字符的行 假设列名是DATA。

我希望得到DATA中的所有行(必须具有所有三个条件!):

  • 数字字符(1 2 3 4 5 6 7 8 9 0
  • 短跑(-
  • 逗号(,

例如:

"10,20,20-30,30"没问题

"10,20A,20-30,30Z"不正常

"30"不正常

"AAAA"不正常

"30-"不正常

"30,"不正常

"-,"不正常

4 个答案:

答案 0 :(得分:4)

尝试patindex:

select * from(
    select '10,20,20-30,30' txt union
    select '10,20,20-30,40' txt union
    select '10,20A,20-30,30Z' txt
)x
where patindex('%[^0-9,-]%', txt)=0

对于你的表,请尝试:

select 
    DATA
from 
    YourTable
where 
    patindex('%[^0-9,-]%', DATA)=0

根据您新编辑的问题,查询应如下:

select 
    DATA
from 
    YourTable
where 
    PATINDEX('%[^0-9,-]%', DATA)=0 and
    PATINDEX('%[0-9]%', LEFT(DATA, 1))=1 and
    PATINDEX('%[0-9]%', RIGHT(DATA, 1))=1 and
    PATINDEX('%[,-][-,]%', DATA)=0 

答案 1 :(得分:2)

编辑:您的问题已被修改,因此此答案不再正确。我不打扰更新它,因为其他人已经更新了他们的。这个答案不符合必须找到所有三种字符类型的条件。


你可以使用LIKE表达式,虽然它有点令人费解:

where data not like '%[^0123456789,!-]%' escape '!'

说明:

[^...]匹配...部分中的任何字符。 %匹配任何字符的任意数字(包括零)。因此[^0123456789-,]是您要禁止的字符集。

但是: -[]中的一个特殊字符,所以我们必须使用转义字符来逃避它,我选择了{ {1}}。

因此,您匹配包含(!)任何不在您的禁止集中的字符的行。

答案 2 :(得分:0)

使用PATINDEXLIKE逻辑运算符

选项
SELECT *
FROM dbo.test70
WHERE PATINDEX('%[A-Z]%', DATA) = 0
  AND PATINDEX('%[0-9]%', DATA) > 0
  AND DATA LIKE '%-%'
  AND DATA LIKE '%,%'

SQLFiddle上的演示

答案 3 :(得分:0)

如前所述,你可以使用LIKE表达式,但它只能进行一些微小的修改,否则会过滤掉太多的行。

SELECT * FROM X WHERE T NOT LIKE '%[^0-9!-,]%' ESCAPE '!'

在此处查看工作示例: http://sqlfiddle.com/#!3/474f5/6

修改

满足所有3个条件:

    SELECT * 
    FROM X
    WHERE T LIKE '%[0-9]%'
      AND T LIKE '%-%'
      AND T LIKE '%,%'

请参阅:http://sqlfiddle.com/#!3/86328/1

也许不是最美丽但是有效的解决方案。