【发布时间】:2018-03-20 12:25:39
【问题描述】:
假设我有 2 个表,其中两个表都有名为 Brand 的列。该值以逗号分隔,例如,如果其中一个表具有
ACER,ASUS,HP
AMD,NVIDIA,SONY
作为价值。然后另一个表有
HP,GIGABYTE
MICROSOFT
SAMSUNG,PHILIPS
作为价值观。
我想比较这些表以获取所有匹配的记录,在我的示例中 ACER,ASUS,HP 和 HP,GIGABYTE 匹配,因为两者都有 HP。现在我正在使用循环来实现这一点,我想知道是否可以在单个查询语法中做到这一点。
【问题讨论】:
-
没有优雅或有效的方法来做到这一点,因为它根本不是 RDBMS 的设计方式。这些值中的每一个都应该在表中的自己的行中单独存在 - 然后所有这些都变得非常容易查询。如果可能的话,你应该相应地重新设计。
-
它可以在没有循环和单个查询的情况下实现,但是您需要一个字符串拆分功能才能在两端应用并随后加入。如果您使用的是 SQL Server 2016+,则可以使用
STRING_SPLIT函数。 -
互联网上有很多不使用 while 循环的碎片。有些使用 Tally Tables,有些使用 XML,并且您也有 CLR 函数。此外,正如@EzequielLópezPetrucci 刚才所说(并且打败了我),SQL Server 2016 有一个内置的
STRING_SPLIT函数。 -
好吧,正确的解决方案是规范化您的数据库。阅读Is storing a delimited list in a database column really that bad?,您会看到很多理由说明为什么这个问题的答案是绝对是的!如果这是不可能的,请使用字符串拆分功能。
-
@SalmanA:不,我使用的是 2012。而且我不能简单地更改设计并删除整个逗号分隔的列。
标签: sql sql-server tsql split