首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“WHERE”子句中使用“中间”运算符之后的“然后‘'CASE’语句

在“WHERE”子句中使用“中间”运算符之后的“然后‘'CASE’语句
EN

Stack Overflow用户
提问于 2014-02-12 15:57:20
回答 3查看 8.3K关注 0票数 1

是否可以在WHERE子句中使用CASE语句中的操作符?例如,在下面的代码中,条件应该是在(sysdate-12)和(sysdate-2)之间(sysdate-2)之间(如果是星期一),而在pydate (sysdate-11)和(Sysdate 1)之间,如果是星期二等等。但下面这些都不管用。也许还有另一种写作方式。有人能帮忙吗?

代码语言:javascript
复制
  select * from table_name
  where pricekey = 'JUF' and  
 case when to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='MON' then pydate between to_date(sysdate-12,'DD-MON-YY') and to_date(sysdate-2,'DD-MON-YY')
 when to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='TUE' then pydate between to_date(sysdate-11,'DD-MON-YY') and to_date(sysdate-1,'DD-MON-YY')
 else pydate='sysdate'
 end
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-12 16:01:36

您可以应用您正在尝试的逻辑,但是它是在没有CASE的情况下完成的。相反,您需要创建OR/AND的逻辑分组,以便将BETWEEN与您的情况下的其他匹配条件结合起来。

这是因为CASE被设计为返回一个值,而不是动态地构造其中的SQL。

代码语言:javascript
复制
SELECT *
FROM  table_name
WHERE
  pricekey = 'JUF'
  AND (
    -- Condition 1
    (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'MON' AND pydate BETWEEN to_date(sysdate-12,'DD-MON-YY') AND to_date(sysdate-2,'DD-MON-YY'))
    -- Condition 2
    OR (to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='TUE' AND pydate BETWEEN to_date(sysdate-11,'DD-MON-YY') AND to_date(sysdate-1,'DD-MON-YY'))
    -- ELSE case, matching neither of the previous 2
    OR (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') NOT IN ('MON', 'TUE') AND pydate = 'sysdate')
  )
票数 1
EN

Stack Overflow用户

发布于 2014-02-12 16:02:30

这很难用case编写。只要做:

代码语言:javascript
复制
where pricekey = 'JUF' and  
      ((to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'MON' and
        pydate between to_date(sysdate-12,'DD-MON-YY') and to_date(sysdate-2,'DD-MON-YY')
       ) or
       (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'TUE' and
        pydate between to_date(sysdate-11,'DD-MON-YY') and to_date(sysdate-1,'DD-MON-YY')
       ) or
       (o_char(to_date(sysdate,'DD-MON-YY'), 'DY') not in ('MON', 'TUE') and
        pydate = trunc(sysdate)
       )
      )

注意,我还删除了"sysdate“周围的单引号,因此它不会被视为字符串。而且,我没有时间就得到了日期部分。

票数 1
EN

Stack Overflow用户

发布于 2014-02-12 16:12:18

首先,sysdate是一个日期,所以不要在上面使用to_date。

第二,不要依赖日期名称。一旦选择了另一种语言设置,您的语句可能就不再工作了。

那么,黄铁矿就是一个约会。sysdate就是约会。不要将黄铁矿与字符串“sysdate”进行比较,而是将其与sysdate进行比较。

您似乎也在尝试用to_date从sysdate中删除时间部分(sysdate-11,‘’)。用于删除日期时间的时间部分的函数是trunc。

然后case语句应该返回一个值。SQL中不存在布尔数据类型,因此不能计算内部表达式并返回结果。不是这样做的,而是返回一个有效的数据类型,例如数字或字符串,您可以在外部进行比较:

代码语言:javascript
复制
select * 
from table_name
where pricekey = 'JUF' and  
case 
  when to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN')='MON' then
    case when pydate between trunc(sysdate)-12 and trunc(sysdate)-2 then 'GOOD' else 'BAD' end
  when to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN')='TUE' then 
    case when pydate between trunc(sysdate)-11 and trunc(sysdate)-1 then 'GOOD' else 'BAD' end
  else 
    case when pydate = trunc(sysdate) then 'GOOD' else 'BAD' end
end = 'GOOD';

如果pydate可以有一个时间部分,您可能想用trunc( pydate )代替pydate(Pydate)。

当然,您可以使用一些and、OR和圆括号来完成所有这些操作,而不是用CASE语句。这取决于你对你更易读些什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21732948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档