在postgres中合并查询

时间:2018-05-26 00:10:10

标签: sql postgresql

我有一个问题:

SELECT $ID_TABLE,
        TO_CHAR($DATE_COLUMN,'YYYYMMDD') ,
        '$UPPER_HOUR',
        COUNT(1)
FROM $TABLE_NAME
WHERE DATE_TRUNC('day',$DATE_COLUMN) = cast('$TODAY' as date)
        AND TO_CHAR($DATE_COLUMN,'HH24MI') BETWEEN '$LOWER_HOUR' AND '$UPPER_HOUR'
        GROUP BY TO_CHAR($DATE_COLUMN,'YYYYMMDD');

但在某些情况下,查询在其他情况下的数据为空。

然后,如果为null,我需要选择其他值,例如:

SELECT(coalesce(
SELECT $ID_TABLE,
        TO_CHAR($DATE_COLUMN,'YYYYMMDD') ,
        '$UPPER_HOUR',
        COUNT(1)
FROM $TABLE_NAME
WHERE DATE_TRUNC('day',$DATE_COLUMN) = cast('$TODAY' as date)
        AND TO_CHAR($DATE_COLUMN,'HH24MI') BETWEEN '$LOWER_HOUR' AND '$UPPER_HOUR'
        GROUP BY TO_CHAR($DATE_COLUMN,'YYYYMMDD')),select $ID_TABLE, $date, $PPER_HOUR, 0);"

可以做那样的事情。

这适用于插入带有该选择的进程。

如果我没有任何行,我需要插入具有常量日期和count(1)= 0的值。

$的值是常量

谢谢;)

2 个答案:

答案 0 :(得分:1)

也许这就是你的意思:

WITH t as (
      SELECT $ID_TABLE as col1, TO_CHAR($DATE_COLUMN, 'YYYYMMDD') as col2,
             '$UPPER_HOUR' as col3,
             COUNT(1) as col4
      FROM $TABLE_NAME
      WHERE DATE_TRUNC('day',$DATE_COLUMN) = cast('$TODAY' as date) AND
            TO_CHAR($DATE_COLUMN, 'HH24MI') BETWEEN '$LOWER_HOUR' AND '$UPPER_HOUR'
      GROUP BY TO_CHAR($DATE_COLUMN, 'YYYYMMDD'
     )
SELECT *
FROM T
UNION ALL
SELECT v.*
FROM (VALUES (?, ?, ?, ?)) v(col1, col2, col3, col4)
WHERE NOT EXISTS (SELECT 1 FROM t);

答案 1 :(得分:0)

只有当查询返回单个值时,才能以这种方式使用coalesce()

您可以使用plpgsql blockFOUND variable,就像在此伪代码中一样:

do $$
begin
    insert into my_table
    <a select query>;

    if not found then
        insert into my_table
        values(<some default values>);
    end if;
end $$;