逗号分隔值sql

时间:2014-04-29 01:19:49

标签: sql sql-server-2008

从我的网上研究中我发现了这个问题的两个答案,我试图远离它。

  1. 我无法修改表格或添加新表格,因为该软件是第三方,需要表格保持不变。

  2. 我试图远离使用临时表或额外的用户定义函数。

  3. 这是我的问题。

    数据库中有一列是一个逗号分隔的数字列表,代表一周中的几天,即(1,2,4,5,7)。

    我正在尝试找到一种方法来读取该数据,并找出是否有任何行,其中该列表示连续3天的天数。

    应该用

    返回任何内容
    1,2,3  
    2,3,4  
    3,4,5  
    5,6,7  
    1,,,,,6,7  
    1,2,,,,,7  
    

    但如果列有1,2,3,4,则不应返回两次。有很多行有2,3,4,5,6,我提出的任何解决方案都会返回3次。

    最好,我想创建一个存储过程来传递一个数字并查找连续几天的数量。因此,如果传入5,它将查找连续5天标记的任何内容。

    除了使用额外的表格之外还有其他选择吗?如果是这样,你能告诉我怎么做这个工作吗?我不是SQL的新手,但有很多我不熟悉的高级查询技术。

2 个答案:

答案 0 :(得分:1)

以下强力方法适用于所有数据库:

select (case when col like '%1%' and col like '%2%' and col like '%3%' then 1
             when col like '%2%' and col like '%3%' and col like '%4%' then 1
             when col like '%3%' and col like '%4%' and col like '%5%' then 1
             when col like '%4%' and col like '%5%' and col like '%6%' then 1
             when col like '%5%' and col like '%6%' and col like '%7%' then 1
             when col like '%6%' and col like '%7%' and col like '%1%' then 1
             when col like '%7%' and col like '%1%' and col like '%2%' then 1
             else 0
        end) as HasThreeConsecutiveDays

如果连续三天,则返回0/1标志。

答案 1 :(得分:0)

  

因此,如果传入5,它将查找连续5天标记的任何内容。

如果没有动态的sql,你将无法做到这一点,因为你想支持从7回到1的包装。我可以编写一个查询,如果你没有&#39,你会在一个语句中为你做这个关心从一周末回到开头的包装,但是根据这个要求,我没有看到如何在没有在程序中构建动态sql字符串的情况下这样做,我没有时间现在玩(也许其他人会采取这个想法并与​​之一起运行)。

现在这个选项失败了,我可以这样做:

WHERE
    (     col like '1,2,3%' 
       OR col like '%2,3,4%'
       OR col like '%3,4,5%'
       OR col like '%4,5,6%'
       OR col like '%5,6,7'
       OR col like '1%6,7'
       OR col like '1,2%7'
    )

这应该比检查另一个答案中显示的单个数字更好,因为完成的模式匹配更少。但是,仅在我们能够保证排序顺序时才有效。我们还需要事先知道逗号在数字之间是如何间隔的,但是如果需要,我们可以通过用空字符串替换所有逗号和/或空格来修复该问题(并相应地调整模式)。

还有一个想法:我意识到我可以支持日计数参数,如果你可以管理将某个额外的表偷偷带进某个地方的db。该表看起来像这样:

 create Table DayPatterns (Days int, Pattern varchar(13) ) 

,表格中的数据如下所示:

1   1%
1   %2%
1   %3%
...
2   1,2%
2   %2,3%
2   %3,4%
2   %4,5%
...
2   1%7
...
3   1,2,3%
3   %2,3,4%
...
3   1%6,7
3   1,2%7
...
7   1,2,3,4,5,6,7

希望你能明白如何填补这一点。有了这个表,您可以使用如下查询对表进行JOIN:

INNER JOIN DayPatterns p ON p.Days = @ConsecutiveDays AND col LIKE p.Pattern

完成这项工作的关键(除了需要能够在某处创建该表之外)还在正确的列上执行GROUP BY。否则,您最终会遇到与现在相同的问题,其中匹配多个可能的连续日模式将会复制您的结果。

最后,当然你知道大多数包含csv数据的架构都被打破了,但是因为你似乎无法解决这个问题,所以希望其中一个想法会有所帮助。