如果前者存在,如何创建一个选择列而不是另一列的 postgres 查询
how to create a postrgres query selecting a column instead of another if former exists
我需要像这样为 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'
但问题是检索到的字段是一个字符串,无法与类型为 timestamp with time zone
的字段 test_endtime
合并
P.S。我会更好地解释我需要什么,查询可以在不同的 table 之间:table1
(在上面的示例中)将始终包含一个 test_endtime
列和各种其他 tables table2...tableN
其中可能是也可能不是 override_tetime
列;如果连接的 table 具有该列,则生成的行集应使用来自 override_tetime
列的时间戳。
希望现在更容易理解了。
无法使用 SQL 中的单个语句执行此操作。
您必须在查询中的某处指定 t1.column1
的名称(作为标识符,而不是字符串常量),如果 t1
没有,这将触发解析错误名为 column1
.
的列
您必须在第一个查询中检查列是否存在(可能像您一样查询 information_schema
),然后根据第一个查询的结果发出第二个查询。
如果您不想在您的应用程序代码中使用该逻辑,可以轻松编写一个 PostgreSQL 函数来为您完成。
我需要像这样为 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'
但问题是检索到的字段是一个字符串,无法与类型为 timestamp with time zone
的字段test_endtime
合并
P.S。我会更好地解释我需要什么,查询可以在不同的 table 之间:table1
(在上面的示例中)将始终包含一个 test_endtime
列和各种其他 tables table2...tableN
其中可能是也可能不是 override_tetime
列;如果连接的 table 具有该列,则生成的行集应使用来自 override_tetime
列的时间戳。
希望现在更容易理解了。
无法使用 SQL 中的单个语句执行此操作。
您必须在查询中的某处指定 t1.column1
的名称(作为标识符,而不是字符串常量),如果 t1
没有,这将触发解析错误名为 column1
.
您必须在第一个查询中检查列是否存在(可能像您一样查询 information_schema
),然后根据第一个查询的结果发出第二个查询。
如果您不想在您的应用程序代码中使用该逻辑,可以轻松编写一个 PostgreSQL 函数来为您完成。