我想采取第一行(postgresql 9.2):
SELECT posts.employee_id, posts.month, posts.year
FROM posts
WHERE ((posts.month = 9 AND posts.year = 2013)
OR
(posts.month IS NULL AND posts.year IS NULL))
ORDER BY posts.employee_id
但它返回:
目标是为每个employee_id获取结果只有一行:
如果发现月份和年份
然后返回第一个记录的月份和年份
ELSE返回第二条记录,其中month = NULL,YEAR = NULL
应该只有一行(而不是图片中的两个)
它似乎是非现有记录的默认回退。
答案 0 :(得分:1)
SELECT posts.employee_id, posts.month, posts.year
FROM posts
WHERE posts.employee_id = 1
AND (posts.month = 9 AND posts.year = 2013)
OR (posts.month IS NULL AND posts.year IS NULL)
ORDER BY month DESC NULLS LAST
LIMIT 1
NULLS FIRST和NULLS LAST选项可用于确定 是否在排序中的非空值之前或之后出现空值 排序。默认情况下,null值排序为大于任何非null值 值;也就是说,NULLS FIRST是DESC命令和NULLS的默认设置 最后,否则。
答案 1 :(得分:1)
不完全确定MAX
在PostgreSQL中的行为如何,但这样的内容可以在SQL-server
中使用:
SELECT
posts.employee_id,
max(posts.month) as "month",
max(posts.year) as "year"
FROM posts
WHERE
(posts.month = 9 AND posts.year = 2013)
OR
(posts.month IS NULL AND posts.year IS NULL)
GROUP BY posts.employee_id
这假设每个id只返回一个或两个记录。
编辑(更新小提琴)
答案 2 :(得分:0)
您可以订购结果,并在查询结束时加上限制1。你对第一条记录有什么定义吗?
答案 3 :(得分:0)
你可以在postgresql中模拟这样的rownum;
Postgresql> 8.4
SELECT
row_number() OVER (ORDER BY col1) AS i,
e.col1,
e.col2,
...
FROM ...