Este é obviamente um SSCCE.
Eu tenho uma inventory
tabela que contém o número de itens ( numOfItems
) em um depósito em uma determinada data ( inventoryDate
). Ambos são números inteiros para manter as coisas simples:
CREATE TABLE inventory(inventoryDate INTEGER, numOfItems INTEGER);
ALTER TABLE inventory ADD PRIMARY KEY (inventoryDate);
Agora eu tenho algumas entradas:
INSERT INTO inventory(inventoryDate, numOfItems) VALUES(1,250),(2,275)
O que foi dito acima é que pontualmente 1
havia 250 itens no depósito e 2
pontualmente 275.
Agora quero testar se, na última data, o número de itens no depósito ultrapassou 1000:
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
O acima parece funcionar. No entanto, no caso extremo em que não há entradas na inventory
tabela, não está funcionando:
DELETE FROM inventory;
SELECT 1000<(SELECT numOfItems FROM inventory ORDER BY inventoryDate DESC LIMIT 1)
... retorna:
?column?
(null)
Eu gostaria de tratar o caso extremo em que não há entradas como denotando zero (0) itens. Eu sei que sempre posso inicializar a inventory
tabela com uma primeira entrada falsa com um valor zero, mas como eu disse, este é um SSCCE (no meu caso real, esta tabela é realmente uma exibição que não desejo modificar).
Então, acabo escrevendo a consulta assim:
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)
O acima parece funcionar. Mas, existe uma maneira mais idiomática? Algo como um COALESCE
mas para um conjunto de resultados vazio em vez de nulo?
Eu acho que você quer
coalesce
fora da expressão de subconsulta.COALESCE
em um externoSELECT
faz o trabalho para um único valor. Não funcionaria para selecionar várias colunas ou linhas , no entanto.Esta técnica
UNION ALL
funciona universalmente :Ou
SELECT 0
em vez deSELECT NULL
salvar outroCOALESCE
.Parênteses em primeiro lugar
SELECT
não são opcionais.Mais detalhes nesta resposta relacionada no SO.