这显然是一个SSCCE。
我有一个inventory
表格,其中包含numOfItems
在任何给定日期( )仓库中的项目数量( inventoryDate
)。两者都是整数,以保持简单:
CREATE TABLE inventory(inventoryDate INTEGER, numOfItems INTEGER);
ALTER TABLE inventory ADD PRIMARY KEY (inventoryDate);
现在我有一些条目:
INSERT INTO inventory(inventoryDate, numOfItems) VALUES(1,250),(2,275)
上面说的是,1
仓库里准时有 250 件物品,准时2
有 275 件。
现在我想测试一下,在最晚的日期,仓库中的商品数量是否超过了 1000:
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
以上似乎工作。但是,在inventory
表中根本没有条目的边缘情况下,它不起作用:
DELETE FROM inventory;
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
...返回:
?column?
(null)
我想将根本没有条目的边缘情况视为表示零 (0) 项。我知道我总是可以inventory
用值为零的假第一个条目来初始化表,但就像我说的那样,这是一个 SSCCE(在我的真实情况下,这个表实际上是一个我不想修改的视图)。
所以我最终写了这样的查询:
WITH cte AS (SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
SELECT 1000 < (
CASE
WHEN NOT EXISTS(SELECT 1 FROM cte) THEN 0
ELSE (SELECT numOfItems FROM cte)
END)
以上似乎确实有效。但是,有没有更惯用的方法?类似于 aCOALESCE
但是对于空结果集而不是 null?
我认为您想要
coalesce
在子查询表达式之外。COALESCE
在外部SELECT
为单个值完成工作。但是,不适用于选择多个列或行。这种技术普遍
UNION ALL
适用:或者
SELECT 0
而不是SELECT NULL
保存另一个COALESCE
.first 周围的括号
SELECT
不是可选的。有关 SO 的相关答案中的更多详细信息。