如何获得有关哪一行具有NULL值以及NULL值所在的列的名称的概述

时间:2019-02-27 15:41:38

标签: sql

我有一张带翻译的桌子,像这样:

表格名称:文本

id  |  en   | de    | fr  
1   | test  | NULL  | test  
2   | thing | thing | NULL  
3   | other | NULL  | NULL

en列永远不会null, 每当一个或多个列名称具有NULL值时,我都希望获得所有列名称的概述。因此,从上表中,我想要这个结果:

test  | de  
thing | fr  
other | de | fr  

最理想的情况是,这将在单个查询中完成,但我不知道是否可行。

当前,我使用查询从一种语言(即

)确定NULL值。
SELECT en FROM text WHERE de IS NULL

,然后针对每种语言手动进行操作。

我们将向您提供任何帮助或朝正确方向迈出的一步。

3 个答案:

答案 0 :(得分:1)

这是可以做到的,但是在纯SQL中这样做很麻烦,并且如果添加更多列,可能无法很好地扩展。

还不清楚您对结果显示方式的要求有多严格,这可能会增加很多复杂性。

select en,
       case when de is null then 'de' end as de,
       case wehn fr is null then 'fr' end as fr
  from text
 where coalesce(de, fr) is NULL

(如果您的数据库没有coalesce-我不确定,因为据我所知您没有指定什么DBMS-那么您可以替换where子句

where de is NULL or fr is NULL

答案 1 :(得分:0)

您可以将一列由逗号分隔的值,如下所示:

select
  en,
  case 
    when de is null and fr is null then 'de,fr'
    when de is null then 'de'
    when fr is null then 'fr'
  end nullcolumns
from text

结果将是:

test  | de  
thing | fr  
other | de,fr

如果要为defr分别

select
  en,
  case 
    when de is null then 'de'
    when fr is null then 'fr'
  end colde,
  case 
    when de is null and fr is null then 'fr'
  end colfr
from text

结果将是:

test  | de | 
thing | fr | 
other | de | fr

答案 2 :(得分:0)

一个非常简单的方法是:

select id,
       concat( (case when en is null then 'en;' else '' end),
               (case when de is null then 'de;' else '' end),
               (case when fr is null then 'fr;' else '' end)
             ) as missing_columns
from t
where en is null or de is null or fr is null;