【问题标题】:Select a Value from a table which contains Comma separated values in SQL Server从包含 SQL Server 中逗号分隔值的表中选择一个值
【发布时间】:2020-08-21 11:19:04
【问题描述】:

我有这两张表:

表 1:

表 2:

这两个表在ID 上连接。

我将有2个参数,PersonResource,我必须选择对应的OrderResource 始终是唯一的,可以存储为 CSV。

示例:我将有 Person 3Resource 7 作为输入,我应该得到 Order 5 作为输出。

这必须在 SQL Server 中完成,我不能使用 STRING_SPLIT(兼容性问题)。

【问题讨论】:

  • 更好的解决方案是不存储逗号分隔值。
  • @juergend 客户以这种方式存储,我在这方面无能为力。
  • 如果表按 ID 连接,则在您的示例输出中什么都没有。
  • @FranCerezo Person 3 和 Res 4 有 ID4,他们将加入 ID4

标签: sql sql-server split


【解决方案1】:

您可以尝试使用一个技巧来比较资源的 CSV 字符串:

SELECT t1.[Order]
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.ID = t2.ID
WHERE
    t1.Person = 'Person3' AND
    ',' + t2.Resource + ',' LIKE '%,Res7,%';

但是,正如 cmets 中所述,最好不要在表中存储 CSV。

【讨论】:

  • 感谢您的解决方案。无论如何不要使用Like。这是一个完全可以接受的解决方案,只是想知道是否可以降低运行 LIKE 命令的成本
  • 不是真的...除了STRING_SPLIT(你说这不是你的选择)。因此,您可以了解为什么应该避免使用 CSV。
【解决方案2】:

您可以使用PATINDEX() function PATINDEX() function 返回模式在字符串中的位置。

如果没有找到模式,这个函数返回0。

SELECT *, X.Order
FROM Table1 X
JOIN Table2 Y
    ON X.ID = Y.ID
WHERE
    X. Person = 'Person3' AND
    PATINDEX ('%,Res7,%',CONCAT(',',Y.Resource,',') )>0
  

【讨论】:

  • 注意:您的WHERE 子句,如所写,也会与Res70 匹配错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多