我的一个SQL Server表中有一列这样的列。
column
------
ABC COLLA #1
SF6 DINGS
MEMORY NO. 2
MEMORY NO1, TATA
ABC PIKUS NO 2
39A NY ROAD, S/F'DOK
CHINA/ PPS#494030750
KIKU /769-0133
我想查找仅具有一个或两个数字值的记录。 因此,我的最后一栏将如下所示。
column
------
ABC COLLA #1
SF6 DINGS
MEMORY NO. 2
MEMORY NO1, TATA
ABC PIKUS NO 2
39A NY ROAD, S/F'DOK
在这种情况下,数字位置是字符串中的任意位置。 我知道,如果它可以有第一位或最后一位数字,那么我可以使用
column LIKE '%[0-9]' OR LIKE '[0-9]%'
但是,在这种情况下,数字可以在字符串中的任何位置。由于位置不是固定的,因此使用SUBSTRING将无济于事。 如何获得所需的结果?谢谢。
答案 0 :(得分:2)
喜欢吗?
WITH VTE AS(
SELECT *
FROM (VALUES('ABC COLLA #1'),
('SF6 DINGS'),
('MEMORY NO. 2'),
('MEMORY NO1, TATA'),
('ABC PIKUS NO 2'),
('39A NY ROAD, S/F''DOK'),
('CHINA/ PPS#494030750'),
('KIKU /769-0133')) V([Column]))
SELECT *
FROM VTE
WHERE [Column] NOT LIKE '%[0-9]%[0-9]%[0-9]%' --3 or more numerics is ok
AND [Column] LIKE '%[0-9]%'; --but Contains numerics
编辑:值得一提的是,对于没有全文索引的大型数据集,这将得到证明。带有WHERE
子句并带有前导通配符的查询无法SARGable;表示每行都需要进行全面扫描。
答案 1 :(得分:2)
使用patindex
...感谢Larnu提供的示例数据
WITH VTE AS(
SELECT *
FROM (VALUES('ABC COLLA #1'),
('SF6 DINGS'),
('MEMORY NO. 2'),
('MEMORY NO1, TATA'),
('ABC PIKUS NO 2'),
('39A NY ROAD, S/F''DOK'),
('CHINA/ PPS#494030750'),
('KIKU /769-0133')) V([col1]))
select *
from VTE
where (
PATINDEX('%[0-9]%',col1) > 0 --1 numeric
or PATINDEX('%[0-9]%',SUBSTRING(col1,PATINDEX('%[0-9]%',col1),999)) > 0 --two numberics
)
and
PATINDEX('%[0-9]%',SUBSTRING(col1,PATINDEX('%[0-9]%',col1) + PATINDEX('%[0-9]%',SUBSTRING(col1,PATINDEX('%[0-9]%',col1),999)) + 1,999)) = 0 --3 numerics or more