【问题标题】:Find if a string contains number sequences查找字符串是否包含数字序列
【发布时间】:2018-02-21 05:41:05
【问题描述】:

我正在尝试提出一个查询,该查询可以确定字符串 (varchar) 中是否存在 3 个或更多数字的数字序列。这是针对 SQL Server 的

示例字符串:“521324567” 这行数据会被返回,因为它的序列是“4567”。

示例字符串:“410747823” 这行数据将不会返回,因为没有 3 个或更多数字的序列。

示例字符串:“1274563619” 这行数据将被返回,因为它的序列是“456”。

如果它是一个固定长度的字符串,我想我可能会想出类似于下面的 sql 的东西。

Select num from numbers where substring(num,2,1)=
(select substring(num,1,1)) + 1

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    只有 7 个可能的序列,所以:

    select num
    from numbers
    where num like '%123%'
       or num like '%234%'
       or num like '%345%'
       or num like '%456%'
       or num like '%567%'
       or num like '%678%'
       or num like '%789%'
    

    如果您计算012,那么您也可以为此添加条件。

    【讨论】:

    • 不错的逻辑,但仍然很高兴看到其他逻辑查询。
    • +1 表示仅访问行源一次。我很想知道charindex 是否会比like 导致更少的机器指令执行。有些人(例如,stackoverflow.com/a/22543831/1707353)似乎这么认为。
    • @jeff 我怀疑使用charindex 会产生可衡量的差异
    【解决方案2】:

    试试这个。我知道这有点复杂。但动态工作

    DECLARE @MyNum NVARCHAR(50) = '1274563619'
    
    ;WITH CTE
    AS
    (
        SELECT
           SeqNo = 1,
           MyNum = @MyNum,
           PosNum = SUBSTRING(@MyNum,1,1)
        UNION ALL
        SELECT
           SeqNo = SeqNo +1,
           MyNum,
           PosNum = SUBSTRING(MyNum,SeqNo,1)
           FROM CTE
              WHERE SeqNo <= LEN(@MyNum)
    )
    SELECT
        MyNum
        FROM CTE C1
           WHERE EXISTS
           (
              SELECT 1 FROM CTE C2
                 WHERE 
                    (
                        C2.SeqNo = C1.SeqNo+1 
                        AND
                        C2.PosNum = C1.PosNum+1
                    )
                    OR
                    (
                        C2.SeqNo = C1.SeqNo+2 
                        AND
                        C2.PosNum = C1.PosNum+2
                    )
           )
           GROUP BY MyNum
              HAVING COUNT(1)>2
    

    【讨论】:

      【解决方案3】:

      波西米亚风格是正确的,但这里有一个选择列表的变体:

      select num, case when 
         num like '%012%'
         or num like '%123%'
         or num like '%234%'
         or num like '%345%'
         or num like '%456%'
         or num like '%567%'
         or num like '%678%'
         or num like '%789%'
         or num like '%890%'
         or num like '%901%' 
      then 'Yep' else 'Nope' end as is_there_a_sequence
      from numbers
      

      我还添加了012890。虽然901 可能是一座太远的桥梁。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-21
        • 2013-11-20
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多