Mar*_*tus 5 postgresql postgresql-9.1
这显然是一个 SSCCE。
我有一个inventory表格,其中包含numOfItems在任何给定日期 ( inventoryDate)仓库中的物品数量( )。两者都是整数以保持简单:
CREATE TABLE inventory(inventoryDate INTEGER, numOfItems INTEGER);
ALTER TABLE inventory ADD PRIMARY KEY (inventoryDate);
Run Code Online (Sandbox Code Playgroud)
现在我有一些条目:
INSERT INTO inventory(inventoryDate, numOfItems) VALUES(1,250),(2,275)
Run Code Online (Sandbox Code Playgroud)
上面说的是,1仓库里按时有250件物品,按时2有275件。
现在我想测试一下,在最近的日期,仓库中的物品数量是否超过了 1000:
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
Run Code Online (Sandbox Code Playgroud)
以上似乎有效。但是,在inventory表中根本没有条目的边缘情况下,它不起作用:
DELETE FROM inventory;
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
Run Code Online (Sandbox Code Playgroud)
...返回:
?column?
(null)
Run Code Online (Sandbox Code Playgroud)
我想将根本没有条目的边缘情况视为表示零 (0) 项。我知道我总是可以inventory用一个值为 0 的假第一个条目来初始化表,但就像我说的这是一个 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)
Run Code Online (Sandbox Code Playgroud)
以上似乎确实有效。但是,有没有更惯用的方式呢?类似于COALESCE但对于空结果集而不是 null 的东西?
我认为你想要coalesce子查询表达式之外。
SELECT 1000 < coalesce((SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1), 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1388 次 |
| 最近记录: |