如何在oracle sql中的where条件下使用case语句?
如果条件是ME如何在oracle sql中的where条件下使用case语句?,sql,oracle,case-when,Sql,Oracle,Case When,如果条件是MEB 使用此规则,您的查询是 select * from tab; M N DY - - -------- A B FRIDAY A B SATURDAY A B SUNDAY B A FRIDAY B A SATURDAY B A SUNDAY 您可以使用一个查询,该查询包含不区分大小写的NOT regexp_like(类似于带括号的AND运算符)和组合这些表达式的OR运算符: M N DY - - -------- A B FRIDAY
如何使用?假设您的测试数据如下:
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 and .... not in (...)) OR
(ME>NONME and .... not in (...))
)
您需要计算可以重写为非A或B的含义A->B
使用此规则,您的查询是
select * from tab;
M N DY
- - --------
A B FRIDAY
A B SATURDAY
A B SUNDAY
B A FRIDAY
B A SATURDAY
B A SUNDAY
您可以使用一个查询,该查询包含不区分大小写的NOT regexp_like(类似于带括号的AND运算符)和组合这些表达式的OR运算符:
M N DY
- - --------
A B FRIDAY
B A SUNDAY
如果您热衷于使用case..when语句,则应按照以下步骤进行:
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 )
干杯 通常最好在WHERE子句中使用AND/OR结构而不是大小写表达式。顺便说一下,如果只是为了避免删减空格和指定语言,最好使用缩写名称,例如to_charsysdate+rownum,'DY','nls_date_language=English',而这段代码可能会回答这个问题,提供关于原因和/或的其他上下文。
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 )
.....
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