如果
我知道如何将逗号分隔的列值分隔成不同的列。但是,我的问题是如何在where条件下查询这些列。下面我有一个名为">Details"的示例表。
User Department
---- ----------
User1 Admin, Accounts
User2 Admin
User3 Admin, Finance
假设我想查询属于Admin
但不属于Finance
的用户。正如您可以看到的,User1和User2User3没有。
如何构建一个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 (...)