3
votes

Cas sur la clause WHERE ORACLE

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

4 commentaires

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.


3 Réponses :


4
votes

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


0 commentaires

5
votes

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


3 commentaires

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



2
votes

Je pense que vous devez remplacer la clause where par

((BLOK = 'DD11' and ROWNUM <= 1) or (ROWNUM <= 2))


0 commentaires