【问题标题】:SQLite SELECT with CASE doesn't return expected output带有 CASE 的 SQLite SELECT 不返回预期的输出
【发布时间】:2021-09-25 11:12:21
【问题描述】:

这是一个困扰我好几天的问题。该语句的目的是如果在表中没有找到任何行,或者如果有行要返回最新的(基本上是最大的)bottomDepth,则返回“0”。

SELECT CASE COUNT(_id) 
WHEN 0 THEN '0' ELSE BottomDepth END AS 'BottomDepth'
FROM Stratigraphy WHERE guid='2cd0b6bb-41f2-407e-b6e8-c032824d550f'
AND (InstatanceState IS null OR InstatanceState != 5) AND  (4 IS null OR _id < 4)
AND (DeletedFlag IS NULL OR DeletedFlag < 1) 
ORDER BY _id DESC LIMIT 0,1

问题是当有行时,它不是返回最新的bottomDepth,而是返回表中的第一个bottomDepth(几乎就像它忽略了WHERE 子句一样)。我是 SQL 新手,所以有人可以解释为什么返回 2.0 而不是 4.0?

【问题讨论】:

  • 4 IS null 这是什么?

标签: android sql sqlite


【解决方案1】:

通过在选择列表中使用MAX(BottomDepth),SQLite 将返回包含最大BottomDepth 的行,因此不需要ORDER BYLIMIT
这是记录在案的行为,在Simple Select Processing 中进行了解释:

SELECT COALESCE(MAX(BottomDepth), '0') AS BottomDepth,
       <other columns here>
FROM Stratigraphy 
WHERE guid = '2cd0b6bb-41f2-407e-b6e8-c032824d550f'
  AND (InstatanceState IS null OR InstatanceState <> 5) AND  (? IS NULL OR _id < 4)
  AND (DeletedFlag IS NULL OR DeletedFlag < 1) 

我在4 IS null 中将4 更改为?,因为我认为这是一个错字。将其更改为正确的列名。

【讨论】:

  • @MattCasey 很好,如果它有效,不要忘记点击复选标记接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多