SELECT DY,ME,NONME FROM ( SELECT LEVEL, TO_CHAR(SYSDATE+ROWNUM,'DAY') DY , 0 ME, 2 NONME FROM DUAL CONNECT BY LEVEL <=10 ) WHERE ? If the condition is (ME < NONME) then not in ('SATURDAY','SUNDAY')when (ME> NONME) then not in ('FRIDAY', 'SATURDAY')How to use?
4 Réponses :
( (ME<NONME and .... not in (...)) OR (ME>NONME and .... not in (...)) )
Bien que ce code puisse répondre à la question, il fournit un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question améliore sa valeur à long terme .
Supposons que vos données de test soient les suivantes:
M N DY - - -------- A B FRIDAY B A SUNDAY
Vous devez évaluer l'implication A -> B
qui peut être réécrite comme PAS A OU B
En utilisant cette règle, votre requête
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')) ;
donne
select * from tab; M N DY - - -------- A B FRIDAY A B SATURDAY A B SUNDAY B A FRIDAY B A SATURDAY B A SUNDAY
Vous pouvez utiliser une requête contenant NOT regexp_like ()
insensible à la casse avec des opérateurs AND
entre parenthèses et un opérateur OR
combinant ces expressions: < pre> XXX
Démo kbd >
Si vous souhaitez utiliser l'instruction case..when
, alors cela doit être fait comme suit:
..... 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
Cheers !!
p >
Il est généralement préférable d'utiliser les constructions
AND
/OR
au lieu des expressionscase
expressions dans le codeWHERE > clause .
À propos, il est préférable d'utiliser des noms abrégés (ne serait-ce que pour éviter de couper les espaces) et de spécifier une langue, par exemple
to_char (sysdate + rownum, 'DY', 'nls_date_language = English')