查找字符串中是否包含数字序列

4
我正在尝试编写一个查询,以确定字符串(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
3个回答

4

只有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,那么您也可以添加一个条件。

不错的逻辑,但仍然很兴奋地想看到其他逻辑查询。 - Sandip - Frontend Developer
1
只访问行源一次加1。我很想知道charindex是否会比like执行更少的机器指令。一些人(例如https://dev59.com/7n3aa4cB1Zd3GeqPitYQ#22543831)似乎是这样认为的。 - Jeff Holt
@jeff 我怀疑使用 charindex 代替可能不会有明显的差异。 - Bohemian

1
尝试这个。我知道它有点复杂,但可以动态工作。
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

0

Bohemian 是正确的,但这里有一个选择列表的变体:

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可能有些困难。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接