我只想获取仅包含列中某些字符的行。
假设列名是 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,"不正确
值"-,"不正确
我只想获取仅包含列中某些字符的行。
假设列名是 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,"不正确
值"-,"不正确
尝试 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
编辑:您的问题已被编辑,因此此答案不再正确。我不会费心更新它,因为其他人已经更新了他们的。此答案不满足必须找到所有三种字符类型的条件。
您可以为此使用LIKE表达式,尽管它有点复杂:
where data not like '%[^0123456789,!-]%' escape '!'
解释:
[^...]匹配不在零件中的任何字符...。%匹配任何数字(包括零)的任何字符。[^0123456789-,]您要禁止的字符集也是如此。
但是: -是 内部的一个特殊字符[],所以我们必须转义它,我们使用转义字符来完成,我选择了!.
因此,您匹配不包含 ( not like) 任何不在您的不允许集中的字符的行。
正如已经提到的,您可以使用 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
也许不是最漂亮但可行的解决方案。