我只想获取仅包含列中某些字符的行。
假设列名是 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
也许不是最漂亮但可行的解决方案。