我有一个正在尝试针对 PostgreSQL 9.2 进行优化的查询:
select coalesce(max(id),0) as m from tbl
Run Code Online (Sandbox Code Playgroud)
它需要永远运行,所以我想我可以将其重写为
select id from tbl order by id desc limit 1
Run Code Online (Sandbox Code Playgroud)
0但如果表中没有行则需要返回。我尝试了几种 case 语句的组合,但它们似乎不起作用。有什么建议么?
计划空表:
Aggregate (cost=11.25..11.26 rows=1 width=4)
-> Seq Scan on tbl (cost=0.00..11.00 rows=100 width=4)
Run Code Online (Sandbox Code Playgroud)
具有 1,190,000 行的表的成本为 58k,但执行计划相同。
postgresql coalesce aggregate-functions postgresql-9.2 postgresql-performance
0.0如果以下函数没有返回任何内容,我试图返回:
CREATE OR REPLACE FUNCTION get_height(firstn VARCHAR, lastn VARCHAR)
RETURNS FLOAT AS
$$
DECLARE
height FLOAT = 0.0;
BEGIN
SELECT into height AVG(((p.h_feet * 12) + p.h_inches) * 2.54)
FROM player p
WHERE p.firstname = firstn AND p.lastname = lastn;
RETURN height;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我试过搜索它,发现它COALESCE不起作用.有没有人有任何想法如何解决这个问题?
表结构:
create table player(
firstname text
,lastname text
,h_feet INT
,h_inches INT
);
Run Code Online (Sandbox Code Playgroud)
示例数据:
insert into player values ('Jimmy','Howard',6,2);
Run Code Online (Sandbox Code Playgroud) 我有一个客户端表,我需要按以下顺序从中选择数据:
Gender Count
-----------------
Female 10
Male 50
Unknown 2
Run Code Online (Sandbox Code Playgroud)
(上表数据仅作为示例)
为此,我使用了以下 SQL:
SELECT decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown') "Gender"
, count(ID) "Count"
FROM client c
WHERE c.created <= '01-JAN-2000'
GROUP BY decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown')
ORDER BY decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown')
;
Run Code Online (Sandbox Code Playgroud)
但是,问题是在 2000 年 1 月 1 日之前没有创建客户端!因此,表格显示为空白:
Gender Count
----------------
Run Code Online (Sandbox Code Playgroud)
但是,我想在这种情况下显示如下:
Gender Count
----------------
Female 0
Male 0
Unknown 0
Run Code Online (Sandbox Code Playgroud)
请告诉我该怎么做?