SELECT * FROM ( SELECT P.PC_ID, PC.PC, P.BLOK_ID, B.BLOK, B.ID_MATERIAL, M.MATERIAL, M.NO_MATERIAL, P.START_DTTM, TO_CHAR(P.START_DTTM,'yyyy-mm-dd') DATE_PERENCANAAN FROM UTSG_PERENCANAAN P INNER JOIN UTSG_PC PC ON P.PC_ID = PC.ID_PC INNER JOIN UTSG_BLOK B ON P.BLOK_ID = B.ID_BLOK LEFT JOIN UTSG_MATERIAL M ON B.ID_MATERIAL = M.ID_MATERIAL WHERE P.NO_LAMBUNG = '341' AND P.LOKASI_ID = '2' AND P.START_DTTM < TO_DATE('2019-01-09 23:40:52', 'yyyy-mm-dd hh24:mi:ss') ORDER BY P.START_DTTM DESC ) WHERE CASE WHEN BLOK = 'DD11' THEN ROWNUM <= 1 ELSE THEN ROWNUM <= 2 END I have query like this, on case in where clause always show error ORA-00905: missing keyword
3 Réponses :
Pourquoi utiliser une expression case?
WHERE ( (BLOK = 'DD11' AND ROWNUM <= 1) OR ROWNUM <= 2 )
En général, il est conseillé d'utiliser la "logique booléenne" dans les clauses where, voici un blog sur le sujet: Clauses SQL WHERE: évitez CASE, utilisez la logique booléenne
Vous ne pouvez pas avoir l'opérateur de comparaison dans l'instruction case. Au lieu de cela, votre clause where devrait être quelque chose comme:
WHERE rownum <= CASE WHEN BLOK = 'DD11' THEN 1 ELSE 2 END
Désolé Boneist pour la modification de votre message, je n'ai pas remarqué votre style de format @
@ PhamX.Bach vous avez également changé la requête de l'OP ( DD11
était en minuscules après vos modifications), donc j'ai annulé cela. Veuillez faire très attention à ne pas changer la signification de l'OP lorsque vous éditez.
at & t, merci, mon erreur aujourd'hui
Je pense que vous devez remplacer la clause where par
((BLOK = 'DD11' and ROWNUM <= 1) or (ROWNUM <= 2))
Pouvez-vous fournir des exemples de données et espérer un résultat?
@ D-Shih pourquoi? Nous n'avons pas besoin d'exemples de données pour corriger une erreur de syntaxe.
Il est généralement préférable d'utiliser des constructions AND / OR au lieu d'expressions de cas dans la clause WHERE.
Bien que les réponses données soient syntaxiquement correctes, je suppose qu'elles ne produisent toujours pas le résultat attendu. Mais comme vous n'avez pas expliqué ce que vous attendez de la requête, il est difficile de dire la bonne déclaration.