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.