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

返回子查询MSSQL中ID以分号分隔的字符串表示的行

  •  0
  • Tom  · 技术社区  · 10 年前

    我试图查询sql数据库,以返回ID包含在单独表列中的所有行。项目ID列表保存在 Feedback 中的表格 Project_ID 数据类型为varchar的列。我正在尝试返回 Projects 表中保存ID的 项目ID 数据类型为varchar的列。

    我正在使用查询执行此操作

    SELECT * FROM Projects WHERE Project_ID IN (
        SELECT Project_ID FROM Feedback WHERE ID = 268 and Project_ID IS NOT NULL
    )
    

    当我运行此查询时,会返回以下消息:

    Conversion failed when converting the varchar value '36;10;59' to data type int
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Zohar Peled    10 年前

    这是规范化数据重要性的又一个例子。
    在一列中保持多个数据点几乎永远不是正确的设计,我的意思是99.9999%。

    如果无法规范化数据库,可以使用以下解决方法:

    SELECT * 
    FROM Projects p
    WHERE EXISTS (
        SELECT Project_ID 
        FROM Feedback F WHERE ID = 268 
        AND Project_ID IS NOT NULL
        AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
    )
    

    您不能使用 IN 运算符,因为它需要一个由逗号分隔的值列表,而您试图为它提供一个由分号分隔的值。即使Project_ID中的值由逗号分隔,它仍然不起作用。

    我添加的原因 ; Project_ID 在这两张表中 LIKE 操作员将返回 true 对于它找到的任何位置 Projects.Project_Id Feedback.Project_Id 。您必须添加 ; 项目.Project_Id 以防止 喜欢 返回 真的 当您查找与分隔字符串中的数字部分匹配的数字时。考虑在包含1的字符串中查找12;112;455-不向搜索值添加分隔符(本例中为12) 喜欢 操作员将返回 真的 .