我有一个名为 MyRoles 的列,其中包含存储在名为 UserRoles 的字段中的项目(整数)列表。我想编写一个查询来检查特定项目是否在列表中。该列表将如下所示:“1,2,3”
我无法使用 WHERE MyRoles
查询应该是什么样子?
这与我的想法类似:
SELECT *
FROM MyTable
WHERE MyRoles CONTAINS ('1')
没有一个答案是容易实现的,并且会让我在一条丑陋的道路上走得更远,这一事实确实清楚地表明,规范化数据库始终是最好的选择。
最佳答案
您可以使用LIKE
:
SELECT *
FROM MyTable
WHERE MyRoles LIKE ('%1%')
这可能会表现得很糟糕(因为索引对于这样的搜索来说毫无用处)。当然,即使查询中不存在 1
,也会匹配 10
。您可以扩展该方法:
SELECT *
FROM MyTable
WHERE MyRoles = '1'
OR MyRoles LIKE '1,%'
OR MyRoles LIKE '%,1,%'
更好的解决方案是规范化数据库并且不使用多值字段。使用每行具有单个角色 ID 和项目 ID 的多对多表。这更容易查询。
一些数据库对于此类查询有更好的设施,但这些将是扩展而不是标准 SQL - 您没有提到特定的 RDBMS。
关于SQL-如何检查项目是否在记录的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6363157/