如何 运行 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 中的用户。可以看到,User1User2满足条件,但是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 (...)

的形式