如何在具有逗号分隔值的列上运行select查询



我知道如何将逗号分隔的列值分隔成不同的列。但是,我的问题是如何在where条件下查询这些列。下面我有一个名为">Details"的示例表。

User      Department
----      ----------
User1     Admin, Accounts
User2     Admin
User3     Admin, Finance

假设我想查询属于Admin但不属于Finance的用户。正如您可以看到的,User1User2User3没有。

如何构建一个select查询来获取User3因此

我知道可以使用'like'操作符,但不确定如何使用。

SELECT USER 
FROM DETAILS 
WHERE DEPARTMENT LIKE "Admin"||"Accounts" 
AND NOT LIKE "Finance";

使用操作符LIKE:

SELECT USER 
FROM DETAILS 
WHERE ',' || DEPARTMENT || ',' LIKE '%,' || 'Admin' || ',%'
AND ',' || DEPARTMENT || ',' LIKE '%,' || 'Finance' || ',%'
AND ',' || DEPARTMENT || ',' NOT LIKE '%,' || 'Accounts' || ',%';

或者函数INSTR():

SELECT USER 
FROM DETAILS 
WHERE INSTR(',' || DEPARTMENT || ',', ',' || 'Admin' || ',') > 0
AND INSTR(',' || DEPARTMENT || ',', ',' || 'Finance' || ',') > 0
AND INSTR(',' || DEPARTMENT || ',', ',' || 'Accounts' || ',') = 0;

如果DEPARTMENT列的逗号后面没有空格,则此操作有效。

您正在询问有关数据库设计问题的问题。当设计错误被纠正后,问题就消失了。

具体来说,您的数据库不是1NF:不是第一范式。部门不是标量值,而是一个重复组。1NF要求消除所有重复组。

标准表单的发明是为了帮助数据库设计人员定义可以被SQL充分利用的数据库。在重复组的情况下,SQL没有针对组中的第n个值的操作符(特别是在SQLite中,重复组只是一个字符串)。

要规范化您的表,创建如下:

User      Department
----      ----------
User1     Admin
User1     Accounts
User2     Admin
User3     Admin
User3     Finance
现在您的查询可以使用存在量化来编写。在SQL中,它的形式是where not exists (...)