将一个列值与sql中的单个选择查询中的另一列进行比较

时间:2012-02-28 08:34:48

标签: sql sql-server case

亲爱的程序员,                   我需要在单个选择查询中将一个列值与另一个列进行比较。

我的查询是这样的:

    SELECT ATTNLOG.emp_id,
           ATTNLOG.tdate,
           ATTNLOG.tdate_out,
          (CASE WHEN EXISTS (SELECT * 
                               FROM tbl_emp_overtime 
                              WHERE emp_id=ATTNLOG.emp_id 
                                AND ot_indate=ATTNLOG.tdate)
               THEN 0 
               ELSE 1 
          END) as 'STATUS'
    FROM tbl_emp_attn_log ATTNLOG 
   WHERE ATTNLOG.emp_id=201

在我的情况下,我需要比较ATTNLOG的每一行并分别给出STATUS。

实际上结果会返回像

这样的行值
EMP_ID  TDATE     TDATE_OUT  STATUS
201    2012-2-26  2012-2-26   0
201    2012-2-27  2012-2-27   1

并且表tbl_emp_overtime的值类似于

emp_ID  ot_indate
201    2012-2-27

但是我的代码就像

一样
EMP_ID  TDATE     TDATE_OUT  STATUS
201    2012-2-26  2012-2-26   1
201    2012-2-27  2012-2-27   1

但它没有给出那样的结果。请帮帮我。

3 个答案:

答案 0 :(得分:1)

尝试使用COUNT(*):

SELECT ATTNLOG.emp_id,
           ATTNLOG.tdate,
           ATTNLOG.tdate_out,
          (CASE WHEN  (SELECT count(*)
                               FROM tbl_emp_overtime 
                              WHERE emp_id=ATTNLOG.emp_id 
                                AND trunc(ot_indate)=(ATTNLOG.tdate)) > 0 THEN 0 
               ELSE 1 
          END) as 'STATUS'
    FROM tbl_emp_attn_log ATTNLOG 
   WHERE ATTNLOG.emp_id=201

答案 1 :(得分:1)

如果使用sql 2008将日期转换为date数据类型,如果原始数据类型为datetime则应该有帮助:

SELECT * 
FROM tbl_emp_overtime 
WHERE emp_id=ATTNLOG.emp_id 
AND CAST(ot_indate as DATE)=CAST(ATTNLOG.tdate AS DATE)

答案 2 :(得分:0)

尝试GREATESTLEAST作为您的要求