sql - 比较两个列表项

标签 sql tsql

我试图将存储列表项(逗号分隔)的数据库字段与不幸的是一个也是列表项的变量进行比较。

示例:

在这种情况下,一个用户可以属于多个组,内容访问也分配给多个组。

contentid | group  
 (1)   (c,d)   
 (2)   (a,c)  
 (3)   (b)

因此,我需要选择用户在组 (a,c) 中的所有内容。在这种情况下,应该返回 contentid 1,2。

最佳答案

这是 SQL 2008 的安全但缓慢的解决方案

BEGIN
-- setup
DECLARE @tbl TABLE (
    [contentid] INT
    ,[group] VARCHAR(MAX)
)
INSERT INTO @tbl VALUES
     (1, 'c,d')
    ,(2, 'a,c')
    ,(3, 'd')
-- send your request as simple xml
DECLARE @param XML
SET @param = '<g>a</g><g>c</g>'
-- query
SELECT DISTINCT contentid 
FROM @tbl t
    INNER JOIN @param.nodes('/g') AS t2(g)
        ON ',' + t.[group] + ',' LIKE '%,' + t2.g.value('.', 'varchar(max)') + ',%'
END

您只需将查询作为 XML 片段而不是逗号分隔列表传递。

如果您的组名称是单个字符,或者您可以确定名称不是彼此的字符子集(即:GroupA、GroupAB),则可以优化查询。
ON t.[group] LIKE '%' + t2.g.value('.', 'varchar(max)') + '%'

如果您使用的是没有 XML 解析功能的 RDBMS,则必须使用字符串将查询拆分为临时表并以这种方式工作。

你真的不应该在你的列中使用逗号分隔的值。如果 [group] 列只包含一个值并且您在复合(contentid,group)上具有具有 UNIQUE 约束的重复条目,那会好得多。

关于sql - 比较两个列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014626/

相关文章:

sql-server - 在连接表中,我应该使用主键和唯一约束,还是复合/复合键?

sql - 从表格中选择 TOP x

sql - 事务内部的 SELECT 语句与事务外部的 SELECT 语句之间有区别吗?

mysql - 如何使用 group by 子句选择随机行?

sql - 如何在 SQL 中创建 bool 计算字段并加入该计算字段?

sql - 回滚错误执行的 SQL 查询

javascript - 尝试编写一个依赖于两个不同连接表的 'or' 查询

sql - 将列从日期转换为日期时间

sql-server - Pivot 与 Case T-sql 效率

sql-server - 在 SQL Server 中创建函数?