Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回包含合并的列名_Sql_Postgresql - Fatal编程技术网

Sql 返回包含合并的列名

Sql 返回包含合并的列名,sql,postgresql,Sql,Postgresql,我想从表中的几列中选择第一个NOTNULL值。 通常我会用 SELECT COALESCE(col1, col2, col3) FROM table 但这一次我不需要值,只需要列的名称(或每个列的某些指定文本)和first not null值 例如: 表: col1 | col2 | col3 null | null | 3 null | 5 | 8 2 | null | 2 应返回: col3 col2 col1 有没有办法用一条SQL语句来实现这一点 注意:我使用的是Pos

我想从表中的几列中选择第一个NOTNULL值。 通常我会用

SELECT COALESCE(col1, col2, col3) FROM table
但这一次我不需要值,只需要列的名称(或每个列的某些指定文本)和first not null值

例如:

表:

col1 | col2 | col3
null | null | 3
null | 5    | 8
2    | null | 2
应返回:

col3
col2
col1
有没有办法用一条SQL语句来实现这一点


注意:我使用的是PostgreSQL。

我建议使用
CASE
语句

SELECT 
   CASE WHEN col1 IS NOT NULL THEN 'col1'
        WHEN col2 IS NOT NULL THEN 'col2'
        WHEN col3 IS NOT NULL THEN 'col3'
        ELSE NULL
   END
FROM table;

如果所有列都是字符串,则还可以使用coalesce和replace

SELECT
    REPLACE(COALESCE(COL1||'COL1',COL2||'COL2',COL3||'COL3'),COALESCE(COL1,COL2,COL3),'')
FROM YOUR_TABLE;
如果所有列都是数字,则可以:

SELECT
    'COL'||CAST(COALESCE(COL1+1,COL2+2,COL3+3) - COALESCE(COL1,COL2,COL3) AS CHAR(1))
FROM YOUR_TABLE;

如果不是varchar列,这将是一个好主意。它不适用于列中的实类型值。@LidiaB。我的第二个SQL可以用于数值。如果列有不同的类型,可以将它们全部转换为varchar,然后也可以使用第一个SQL。我知道案例陈述是一个很好的选择,但我认为解决问题的不同方法真的很有趣。有时候当你调整一个SQL时,更多的选择是非常有用的。很抱歉,我在发表评论之前没有注意到编辑过的答案,因为我以前没有刷新过这个页面。我只是尝试了编辑过的答案,但问题是,真实的列名与示例不同,简单地添加“COL”并不是很有用。我还想了解更多信息并尝试不同的方法,因此非常感谢您的帮助:)正如我在上一篇评论中提到的,您可以将实值转换为varchar,然后使用第一个SQL,或者使用case语句将1,2,3转换为列名。对,这可能是最好的方法。我忘了我可以使用带有条件的用例。非常感谢。