早上好,
我的记录中有一个允许的系统字段,可以包含一个数组,例如: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 |
+----------+----------------+------------+
非常感谢任何协助。
度过美好的一天..!
保罗雅各布斯答案 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
条件来避免上述问题18
,118
或181
。
答案 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