1

我知道如何将逗号分隔的列值分隔到不同的列中。但是,我的问题是如何在 where 条件下查询这些列。我在下面有一个名为“详细信息”的示例表。

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

假设我想查询在 anAdmin但不在Finance. 如您所见,User1User2满足条件,但User3不满足。

如何构建选择查询以获取User3作为结果

我知道可以使用“like”运算符,但不确定如何使用。

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

2 回答 2

2

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

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

发明了范式以帮助数据库设计人员定义可以被 SQL 充分利用的数据库。在重复组的情况下,SQL 对组中的第 n 个值没有运算符(尤其是在 SQLite 中,重复组只是一个字符串)。

要规范化您的表,请创建以下内容:

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

现在您的查询可以使用存在量化来编写。在 SQL 中,它采用以下形式where not exists (...)

于 2021-10-03T16:15:50.633 回答
1

使用运算符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

请参阅演示

于 2021-10-03T16:04:03.130 回答