如何在oracle sql中的where条件中使用case语句?
Posted
技术标签:
【中文标题】如何在oracle sql中的where条件中使用case语句?【英文标题】:How to use case statement in where condition in oracle sql? 【发布时间】:2019-12-20 08:11:22 【问题描述】:SELECT DY,ME,NONME
FROM (
SELECT LEVEL, TO_CHAR(SYSDATE+ROWNUM,'DAY') DY , 0 ME, 2 NONME
FROM DUAL
CONNECT BY LEVEL <=10
)
WHERE ?
如果条件是(ME < NONME)
,那么not in ('SATURDAY','SUNDAY')
当(ME> NONME)
然后not in ('FRIDAY', 'SATURDAY')
如何使用?
【问题讨论】:
在WHERE
子句中使用AND
/OR
结构而不是case
表达式通常更好。跨度>
顺便说一句,最好使用缩写名称(如果只是为了避免修剪空白)并指定一种语言,例如to_char(sysdate+rownum, 'DY', 'nls_date_language=English')
【参考方案1】:
(
(ME<NONME and .... not in (...)) OR
(ME>NONME and .... not in (...))
)
【讨论】:
虽然此代码可能会回答问题,但提供有关原因和/或 how this code answers the question improves its long-term value 的其他上下文。【参考方案2】:假设你的测试数据如下:
select * from tab;
M N DY
- - --------
A B FRIDAY
A B SATURDAY
A B SUNDAY
B A FRIDAY
B A SATURDAY
B A SUNDAY
您需要评估 含义 A --> B
可以重写为 NOT A OR B
使用此规则,您的查询是
select * from tab
where
-- (ME < NONME) --> not in ('SATURDAY','SUNDAY')
(not (ME < NONME) or DY not in ('SATURDAY','SUNDAY')) AND
-- (ME> NONME) --> not in ('FRIDAY', 'SATURDAY')
(not (ME > NONME) or DY not in ('FRIDAY', 'SATURDAY'))
;
给予
M N DY
- - --------
A B FRIDAY
B A SUNDAY
【讨论】:
【参考方案3】:您可以使用包含不区分大小写的 NOT regexp_like()
和带括号的 AND
运算符和组合这些表达式的 OR
运算符的查询:
WITH T AS
(
SELECT LEVEL, TO_CHAR(SYSDATE + LEVEL, 'DY','NLS_DATE_LANGUAGE=ENGLISH') DY, 0 ME, 2 NONME
FROM DUAL
CONNECT BY LEVEL <= 10
)
SELECT *
FROM T
WHERE ( NOT regexp_like(dy,'sat|sun','i') AND ME < NONME )
OR ( NOT regexp_like(dy,'sat|fri','i') AND ME > NONME )
Demo
【讨论】:
【参考方案4】:如果您热衷于使用case..when
语句,则应按以下方式进行:
.....
Where case
when ME < NONME and dy not in ('SATURDAY','SUNDAY')
then 1
When ME > NONME and DY not in ('FRIDAY', 'SATURDAY')
then 1
end = 1
干杯!!
【讨论】:
以上是关于如何在oracle sql中的where条件中使用case语句?的主要内容,如果未能解决你的问题,请参考以下文章