SQL WHERE(包含或等于)

时间:2014-02-05 08:41:58

标签: sql postgresql

我想采取第一行(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

但它返回:
Execution of the query
目标是为每个employee_id获取结果只有一行

如果发现月份和年份 然后返回第一个记录的月份和年份 ELSE返回第二条记录,其中month = NULL,YEAR = NULL
应该只有一行(而不是图片中的两个)
它似乎是非现有记录的默认回退。

SQL FIDDLE

4 个答案:

答案 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

From Documentation

  

NULLS FIRST和NULLS LAST选项可用于确定   是否在排序中的非空值之前或之后出现空值   排序。默认情况下,null值排序为大于任何非null值   值;也就是说,NULLS FIRST是DESC命令和NULLS的默认设置   最后,否则。

SQL Fiddle Demo

答案 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只返回一个或两个记录。


编辑(更新小提琴)

SQL Fiddle

答案 2 :(得分:0)

您可以订购结果,并在查询结束时加上限制1。你对第一条记录有什么定义吗?

答案 3 :(得分:0)

你可以在postgresql中模拟这样的rownum;

Postgresql> 8.4

 SELECT 
     row_number() OVER (ORDER BY col1) AS i, 
     e.col1, 
     e.col2, 
     ... 
    FROM ...