SQLITE 检查 id 是不是具有特定值

Posted

技术标签:

【中文标题】SQLITE 检查 id 是不是具有特定值【英文标题】:SQLITE check if id has certain valueSQLITE 检查 id 是否具有特定值 【发布时间】:2018-04-09 11:58:19 【问题描述】:

我有一个这样的 SQLITE 表:

id      key      value
244574  16       999
244574  18       999
244574  54       174
214808  16       662
214808  17       808
214808  33       1
214808  60       2
214809  16       902 
214809  17       1103
214809  33       1
214809  60       2
218965  19       808
218965  21       662
218965  33       1
218965  60       8
218966  19       1103
218966  21       902
218966  33       1
218966  60       8

小提琴:click here

现在我尝试获取键不是 60 或键为 60 且值 = 8 的 ID 列表。当我做一个简单的操作时:

select * from items_attributes where (key != 60) OR (key = 60 AND value = 8);

我得到了 key 不是 60 的那些行。但我只想得到三行作为结果:

id      key           value
244574  [16;18;54]    [999;999;174]
218965  [19;21;33;60] [808;662;1;8]
218966  [19;21;33;60] [1103;902;1;8]

由于我是 SQL 的初学者,所以我只能想到一个使用 concat 的解决方案,但我不知道。也许有人可以在这里帮助我。

提前致谢!

最好的问候, 安德烈亚斯

【问题讨论】:

【参考方案1】:

怎么样:

select 
    id,
    '[' || group_concat(key, ';') || ']',
    '[' || group_concat(value, ';') || ']'
from items_attributes
group by id
having 
    -- no rows with key 60 for this id
    count(case when key = 60 then 1 end) = 0 
or 
    -- 1 or more rows with key 60 & value 8 for this id
    count(case when key = 60 and value = 8 then 1 end) > 0

【讨论】:

太棒了,这正是我想要的。非常感谢!【参考方案2】:

我不确定您希望如何只获得三行。但是,以下查询:-

SELECT 
    id, 
    '['||group_concat(key,';')||']' AS key_group, 
    '['||group_concat(value,';')||']' AS value_group
FROM items_attributes 
WHERE (key != 60) OR (key = 60 AND value = 8) 
GROUP BY id;

结果:-

我现在明白了。这似乎可以满足您的要求:-

SELECT 
    id, 
    '['||group_concat(key,';')||']' AS key, 
    '['||group_concat(value,';')||']' AS value 
FROM items_attributes WHERE id NOT IN(
    SELECT id FROM items_attributes WHERE (key = 60 AND value != 8))
GROUP by id ORDER BY id DESC;

【讨论】:

嗨,迈克,感谢您的回答。这看起来相当不错。但是仍然存在键为 60 且值为 != 8 的 ID。因此不应返回前两行。

以上是关于SQLITE 检查 id 是不是具有特定值的主要内容,如果未能解决你的问题,请参考以下文章

检查是不是有任何标签具有特定的内部 HTML

检查firebase子项是不是具有特定值[重复]

C++ 性能:检查一块内存是不是在特定单元格中具有特定值

如何检查 List<T> 元素是不是包含具有特定属性值的项目

Sqlite检查一行中的值是不是在没有循环的下一行中的值之间

查找具有特定标准的最大值并检查同一组是不是有更高/更低或任何值