从一列中查找具有一个或两个数字值的记录

时间:2018-07-19 15:13:40

标签: sql sql-server sql-server-2016

我的一个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将无济于事。 如何获得所需的结果?谢谢。

2 个答案:

答案 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