【问题标题】:SQL Server : exploding CSV for SELECT statementSQL Server:为 SELECT 语句爆炸 CSV
【发布时间】:2020-04-13 20:58:26
【问题描述】:

我有一个如下表结构;

id  txtName   intReferences
------------------------------
1   Fred      1,4,6,444,56,43,
2   Sam       5,33,5904,43
3   Tom       1200
4   Samantha  43,44,888,99

我想编写一个 T-SQL 查询,以根据提供的一系列数字返回所有记录。

例如,查询 43 将返回 Fred、Sam 和 Samantha。问题是,当查询 3 时,它不应该返回 Sam 或 Samantha 的结果,因为这不是完整的数字。寻找直接和整数匹配

CSV 值可能以逗号结尾。

我尝试使用“IN”语句,但如果数字的任何部分存在,它就会返回结果。考虑到一些数据库限制,理想情况下尝试在不创建函数的情况下实现。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用string_split():

    select t.*
    from t cross apply
         string_split(t.intReferences, ',') s
    where s.value = '3';
    

    然后,修复您的数据模型,这样您就不会将整数值存储在字符串中。这很糟糕,很糟糕,很糟糕。以下是一些原因:

    • 数字应存储为数字,而不是字符串(使用正确的类型)。
    • SQL Server 具有糟糕的字符串操作功能。
    • 一列中只能存储一个值。
    • 应正确声明外键关系。
    • 无法优化生成的查询以使用索引或分区。
    • SQL 有一种存储列表的好方法。它被称为 table 而不是 string

    【讨论】:

    • 感谢 Gordon - 感谢您的及时回复和反馈。出于好奇,在 MySQL 中这是一个相当直接的过程,“IN”语句很好地适应了这一点。在您的场景中,您的建议是创建一个单独的表,其中包含与每个基础记录的单独关系并加入它们?当您可以简单地从主表中对辅助表中的关键行进行 CSV 处理并按上述方式查询时,这肯定是矫枉过正吗?
    • 确定关于 MySQL,@g33k84。不过,Gordon 对数据进行规范化是正确的;永远不要在 RDBMS 中存储分隔数据。
    • @g33k84 。 . .一个合适的数据模型肯定不是“矫枉过正”。它正确使用了关系数据库。
    【解决方案2】:

    显然,适应这种情况的最佳方法是正确规范化数据。

    使用当前结构查询数据的另一种方法是检查逗号 +(您的号码)+ 逗号。像这样的...

    Declare @Temp Table(id int, txtName varchar(200), intReferences varchar(200))
    
    Insert Into @Temp Values(1,   'Fred',      '1,4,6,444,56,43,')
    Insert Into @Temp Values(2,   'Sam',       '5,33,5904,43')
    Insert Into @Temp Values(3,   'Tom',       '1200')
    Insert Into @Temp Values(4,   'Samantha',  '43,44,888,99')
    
    Select  * 
    From    @Temp 
    Where   ',' + intReferences + ',' like '%,' + '43' + ',%'
    
    Select  * 
    From    @Temp 
    Where   ',' + intReferences + ',' like '%,' + '3' + ',%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多