SQL-如何检查项目是否在记录的列表中

标签 sql postgresql-8.4 denormalized

我有一个名为 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/

相关文章:

sql - Oracle 在 DBA_ROLES 上的选择权限

sql - PostgreSQL 8.4 : Summation by account numbers

postgresql - plgpsql - 是否可以声明 setof 记录或表变量?

mysql - 如果括号中有很多值,为什么这个 mysql IN (1,2,3,4...) 条件不起作用?

php - 从数据库中选择 WHERE 一些参数等于字符串 var 的一部分

python - Pandas dataframe.query 到 SQL 'LIKE' 而不使用引擎 ='python'

mysql - 检查一行中的不同值 - sql

postgresql - GROUP_CONCAT 用于 PostgreSQL 中的类似记录

database - NOSQL 反规范化数据模型