5

如果我查询这个:

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 值。

有什么办法可以包含它吗?我的意思是有类似的东西:

...,,...(只是一个双冒号)

4

3 回答 3

5

我手头没有 8.4,但在最近的版本中,array_to_string忽略了你的 NULL,所以问题不是array_agg,而是array_to_string.

例如:

=> select distinct state from orders;
  state  
---------

 success
 failure

那个空白行实际上是一个 NULL。然后我们可以看到这些东西的用途array_aggarray_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调用中消失了。该文档没有指定对 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 和空字符串折叠成一个值,这可能是也可能不是问题。

于 2013-05-25T18:54:30.157 回答
1

您可以在将null值传递到 array_agg 之前使用case语句来处理它:

select
  array_to_string(array_agg(case xxx 
                              when null then 'whatever' 
                              when ''   then 'foo'
                            else xxx end), ', ')

这样,您可以将任意数量的“键”映射到您喜欢的值

于 2013-05-25T19:02:06.457 回答
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。

于 2013-05-25T18:55:01.530 回答