我有一个问题:
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的值。
$
的值是常量
谢谢;)
答案 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 block和FOUND 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 $$;