代码之家  ›  专栏  ›  技术社区  ›  AskMe

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

  •  2
  • AskMe  · 技术社区  · 6 年前

    我的一个SQLServer表中有这样一列。

                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]%'
    

    但是,在这种情况下,数字可以位于字符串.As位置不固定,使用子字符串将没有帮助。 怎样才能得到设计结果?谢谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   S3S    6 年前

    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
    
        2
  •  2
  •   Thom A    6 年前

    比如,这个?

    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 带有前导通配符的子句是不可搜索的;这意味着需要对其进行全面扫描 每一个 行。