如果我查询:
SELECT DISTINCT class_low
FROM groups NATURAL JOIN species
WHERE type ~~ 'faune'
AND class_high ~~ 'Arachnides'
AND (class_middle ~~ 'Araignées' OR class_middle IS NULL)
AND (class_low ~~ '%' OR class_low IS NULL);
我明白了:
class_low
---------------------
Dictynidés
Linyphiidés
Sparassidés
Metidés
Thomisidés
Dolomedidés
Pisauridés
Araignées sauteuses
Araneidés
Lycosidés
Atypidés
Pholcidés
Ségestriidés
Tetragnathidés
Miturgidés
Agelenidés
注意NULL值(它不是空的varchar)。
现在,如果我这样查询:
SELECT array_to_string(array_agg(DISTINCT class_low), ',')
FROM groups NATURAL JOIN species
WHERE type ~~ 'faune'
AND class_high ~~ 'Arachnides'
AND (class_middle ~~ 'Araignées' OR class_middle IS NULL)
AND (class_low ~~ '%' OR class_low IS NULL);
我明白了:
array_to_string
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Agelenidés,Araignées sauteuses,Araneidés,Atypidés,Dictynidés,Dolomedidés,Linyphiidés,Lycosidés,Metidés,Miturgidés,Pholcidés,Pisauridés,Ségestriidés,Sparassidés,Tetragnathidés,Thomisidés
未插入NULL值。
有没有办法包括它?我是说有类似的东西:
... ,, ...(只是一个双冒号)
答案 0 :(得分:4)
我没有8.4方便,但在更新版本中,array_to_string
忽略了您的NULL,因此问题不是array_agg
,而是array_to_string
。
例如:
=> select distinct state from orders;
state
---------
success
failure
该空行实际上是NULL。然后我们可以看到array_agg
和array_to_string
对这些内容的作用:
=> select array_agg(distinct state) from orders;
array_agg
------------------------
{failure,success,NULL}
=> select array_to_string(array_agg(distinct state), ',') from orders;
array_to_string
-----------------
failure,success
NULL在array_to_string
调用中消失。 documentation没有指定对NULL的任何特定处理,但是忽略它们似乎与其他任何东西一样合理。
在版本9.x中,您可以像往常一样使用COALESCE:
=> select array_to_string(array_agg(distinct coalesce(state, '')), ',') from orders;
array_to_string
------------------
,failure,success
所以这可能适合你:
array_to_string(array_agg(DISTINCT coalesce(class_low, '')), ',')
当然,这会将NULL和空字符串折叠成一个值,这可能是也可能不是问题。
答案 1 :(得分:1)
您可以使用 case 语句在传递给array_agg之前处理 null 值:
select
array_to_string(array_agg(case xxx
when null then 'whatever'
when '' then 'foo'
else xxx end), ', ')
这样您可以将任意数量的“键”映射到您喜欢的值
答案 2 :(得分:0)
使用coalesce
函数将NULL转换为空字符串。第一个例子变成了
SELECT DISTINCT COALESCE(class_low, '')
FROM groups NATURAL JOIN species
WHERE type ~~ 'faune'
AND class_high ~~ 'Arachnides'
AND (class_middle ~~ 'Araignées' OR class_middle IS NULL)
AND (class_low ~~ '%' OR class_low IS NULL);
和第二个例子 -
SELECT array_to_string(array_agg(DISTINCT COALESCE(class_low, '')), ',')
FROM groups NATURAL JOIN species
WHERE type ~~ 'faune'
AND class_high ~~ 'Arachnides'
AND (class_middle ~~ 'Araignées' OR class_middle IS NULL)
AND (class_low ~~ '%' OR class_low IS NULL);
请注意 - 并非所有RDBMS都支持COALESCE。在Oracle中它是NVL。