如何 运行 select 查询具有逗号分隔值的列
How to run select query on columns having comma separated values
我知道如何将逗号分隔的列值分隔到不同的列中。但是,我的问题是如何在 where 条件下查询这些列。我在下面有一个名为“Details”的示例 table。
User Department
---- ----------
User1 Admin, Accounts
User2 Admin
User3 Admin, Finance
假设我想查询在 Admin
中但不在 Finance
中的用户。可以看到,User1和User2满足条件,但是User3不满足。
如何构建 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
.
列中每个逗号后没有空格,这将起作用
参见demo。
你问的是关于数据库设计的问题。修改设计错误后问题消失
具体来说,您的数据库不是 1NF:不是第一范式。部门不是标量值,而是代表重复组。 1NF 要求消除所有重复组。
范式的发明是为了帮助数据库设计者定义可以被 SQL 充分利用的数据库。在重复组的情况下,SQL 没有针对组中第 nth 值的运算符(尤其是在 SQLite 中,重复组只是一个字符串).
要使您的 table 正常化,请创建:
User Department
---- ----------
User1 Admin
User1 Accounts
User2 Admin
User3 Admin
User3 Finance
现在您的查询可以使用存在量化来编写。在 SQL 中,采用 where not exists (...)
的形式
我知道如何将逗号分隔的列值分隔到不同的列中。但是,我的问题是如何在 where 条件下查询这些列。我在下面有一个名为“Details”的示例 table。
User Department
---- ----------
User1 Admin, Accounts
User2 Admin
User3 Admin, Finance
假设我想查询在 Admin
中但不在 Finance
中的用户。可以看到,User1和User2满足条件,但是User3不满足。
如何构建 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
.
参见demo。
你问的是关于数据库设计的问题。修改设计错误后问题消失
具体来说,您的数据库不是 1NF:不是第一范式。部门不是标量值,而是代表重复组。 1NF 要求消除所有重复组。
范式的发明是为了帮助数据库设计者定义可以被 SQL 充分利用的数据库。在重复组的情况下,SQL 没有针对组中第 nth 值的运算符(尤其是在 SQLite 中,重复组只是一个字符串).
要使您的 table 正常化,请创建:
User Department
---- ----------
User1 Admin
User1 Accounts
User2 Admin
User3 Admin
User3 Finance
现在您的查询可以使用存在量化来编写。在 SQL 中,采用 where not exists (...)