我有一个像这样的简单搜索查询:
SELECT COUNT(id),
COUNT(CASE WHEN nation = 'german' THEN 1 END),
COUNT(CASE WHEN nation = 'french' THEN 1 END),
AVG(AGE(birthday))
FROM persons;
我的问题是我收到了错误:
ERROR: date out of range for timestamp
我想我收到了此错误,因为并非每个person
都保存了birthday
。
birthday
是date-field
如何防止此错误,并且仅限有效日期的平均生日?谢谢
答案 0 :(得分:1)
这个怎么样:
SELECT COUNT(id),
COUNT(CASE WHEN nation = 'german' THEN 1 END),
COUNT(CASE WHEN nation = 'french' THEN 1 END),
AVG(AGE(COALESCE(birthday, 0) ))
FROM persons where birthday is not null;
答案 1 :(得分:1)
我会使用另一个case语句从avg(age())
计算中排除无效的空值:
SELECT
COUNT(id),
COUNT(CASE WHEN nation = 'german' THEN 1 END),
COUNT(CASE WHEN nation = 'french' THEN 1 END),
AVG(CASE WHEN birthday IS NOT NULL THEN AGE(birthday) END)
FROM persons;
如果您要添加where birthday is not null
子句,则平均值将是正确的(或尽可能正确),但由于排除的行未被计算,计数将会关闭。
请参阅此SQL Fiddle demo,并注意两个查询之间的计数差异。