在SQL中查找数组中特定值的数据

时间:2010-11-04 13:58:26

标签: sql sql-server

早上好,

我的记录中有一个允许的系统字段,可以包含一个数组,例如:22,18,21

我想要做的是,如果系统18正在访问数据库并且正在提取系统18允许的所有记录,我该如何在sql中编写它。

+----------+----------------+------------+
| AdvertID | AllowedSystems | AdvertName |
+----------+----------------+------------+
| 47       | 22, 18, 21, 3  | GeorgesAd  |
+----------+----------------+------------+
| 49       | 2, 7, 9, 6     | StevesAd   |
+----------+----------------+------------+
| 47       | 18, 12, 32, 8  | PetesAd    |
+----------+----------------+------------+

非常感谢任何协助。

度过美好的一天..!

保罗雅各布斯

5 个答案:

答案 0 :(得分:2)

这将首先测试性能最佳的情况,希望通过非规范化结构从预期的低效查询中获得一些性能。

前两个WHERE子句可以利用AllowedSystems上的索引,虽然这可能仅在少数情况下有所帮助,具体取决于您的数据。

select AdvertID, AdvertName 
from MyTable
where AllowedSystems = '18'
    or AllowedSystems like '18,%'
    or AllowedSystems like '%, 18'
    or AllowedSystems like '%, 18,%'

答案 1 :(得分:1)

注意:我在搜索列的开头添加一个空格,在末尾添加一个逗号,以便考虑18是列表中第一个或最后一个条目的情况。然后我在字符串中搜索“18”。

select *
    from YourTable
    where charindex(' 18,', ' ' + AllowedSystems + ',') <> 0

答案 2 :(得分:1)

首先,这对于数据结构来说是个坏主意。您可能应该通过添加AllowedSystems表来规范化每个系统和广告对的记录。

其次,你想要使用它:

SELECT AdvertID, AdvertName
FROM MyTable
WHERE AllowedSystems LIKE '%18%'

当你获得超过100个系统时,你会遇到问题,因为没有办法判断命中是针对18还是118还是181

编辑:

或者您可以使用RedFilter的多个WHERE条件来避免上述问题18118181

答案 3 :(得分:1)

表现不佳的方式是:

SELECT AdvertID, AdvertName
FROM YourTable
WHERE ', ' + AllowSystems + ', ' LIKE '%, 18, %'

但是,理想情况下,您应该有一个具有复合键的额外表:

Table: AdvertAllowedSystem
AdvertID
SystemID

这样您就可以进行更高效的SARGable查询:

SELECT a.AdvertID, a.AdvertName
FROM AdvertAllowedSystem s
    INNER JOIN Advert a ON s.AdvertId = a.AdvertId
WHERE s.SystemId = 18

答案 4 :(得分:0)

此外,如果您有可能更改创建物化视图的设计,为此您可以使用hierarchyid Data Type或Rank和Unrank