我需要为这样的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
列中的时间戳。
希望现在可以理解这一点。
答案 0 :(得分:0)
使用SQL中的单个语句无法执行此操作。
您必须在查询中的某处指定t1.column1
的名称(作为标识符,而不是字符串常量),如果t1
没有列,则会触发解析错误名为column1
。
您必须在第一个查询中检查列是否存在(可能像您一样查询information_schema
),然后发出第二个查询,该查询取决于第一个查询的结果。
如果您不希望在应用程序代码中使用该逻辑,那么编写一个为您完成此功能的PostgreSQL函数会很容易。