我想只获取那些只包含列中某些字符的行 假设列名是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,"
不正常
值"-,"
不正常
答案 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)
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
也许不是最美丽但是有效的解决方案。