如果前者存在,如何创建选择列而不是另一列的postrgres查询

时间:2017-01-22 15:43:16

标签: postgresql information-schema

我需要为这样的postgresql(9.1+)创建一个查询(在php中,但这并不重要)

select (<t1.column1 -if exists- or t2.column2>)::timestamp from t1 join t2 on <join field>

我写的是:

SELECT bytes_in, 
       coalesce((select column_name from information_schema.columns where table_name = 'table2' and column_name = 'override_tetime'), test_endtime)::timestamp as tetime
  FROM table2 t
  JOIN table1 tr ON (tr.id=t.tres_id)
 WHERE tetime BETWEEN '2016-06-01' AND '2017-01-01'

但问题是检索到的字段是字符串,无法与字段test_endtime合并,字段为带时区的时间戳

P.S。我将更好地解释我需要的内容,查询可以在不同的表之间进行:table1(在上面的示例中)将始终包含test_endtime列和各种其他表{{1可能或可能不是table2...tableN列的地方;如果连接表具有该列,则生成的行集应使用override_tetime列中的时间戳。

希望现在可以理解这一点。

1 个答案:

答案 0 :(得分:0)

使用SQL中的单个语句无法执行此操作。

您必须在查询中的某处指定t1.column1的名称(作为标识符,而不是字符串常量),如果t1没有列,则会触发解析错误名为column1

您必须在第一个查询中检查列是否存在(可能像您一样查询information_schema),然后发出第二个查询,该查询取决于第一个查询的结果。

如果您不希望在应用程序代码中使用该逻辑,那么编写一个为您完成此功能的PostgreSQL函数会很容易。