1

我只想获取仅包含列中某些字符的行。
假设列名是 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

4 回答 4

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 
于 2013-04-03T08:58:51.797 回答
2

编辑:您的问题已被编辑,因此此答案不再正确。我不会费心更新它,因为其他人已经更新了他们的。此答案不满足必须找到所有三种字符类型的条件。


您可以为此使用LIKE表达式,尽管它有点复杂:

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

解释:

[^...]匹配不在零件中的任何字符...%匹配任何数字(包括零)的任何字符。[^0123456789-,]您要禁止的字符集也是如此。

但是: -是 内部的一个特殊字符[],所以我们必须转义它,我们使用转义字符来完成,我选择了!.

因此,您匹配包含 ( not like) 任何不在您的不允许集中的字符的行。

于 2013-04-03T08:54:24.413 回答
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上的演示

于 2013-04-03T09:01:15.273 回答
0

正如已经提到的,您可以使用 LIKE 表达式,但它只能在进行一些小的修改时起作用,否则将过滤掉太多的行。

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

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

编辑:

满足所有3个条件:

    选择 *
    从 X
    在哪里喜欢'%[0-9]%'
      和 T 喜欢 '%-%'
      和 T 喜欢 '%,%'

见:http ://sqlfiddle.com/#!3/86328/1

也许不是最漂亮但可行的解决方案。

于 2013-04-03T09:14:35.907 回答