Дело о том, где пункт ORACLE - PullRequest
0 голосов
/ 09 января 2019
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

У меня есть запрос, подобный этому, на случай, когда предложение всегда показывает

ошибка ORA-00905: отсутствует ключевое слово

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы не можете иметь оператор сравнения внутри оператора case. Вместо этого ваше предложение where должно выглядеть примерно так:

WHERE 
    rownum <= CASE WHEN BLOK = 'DD11' THEN 1
                   ELSE 2
              END
0 голосов
/ 09 января 2019

Я думаю, вам нужно заменить пункт where на

((BLOK = 'DD11' and ROWNUM <= 1) or (ROWNUM <= 2))
0 голосов
/ 09 января 2019

Зачем использовать регистр выражений?

WHERE (
        (BLOK = 'DD11' AND ROWNUM <= 1)
        OR 
        ROWNUM <= 2
    )

В общем случае рекомендуется использовать «логическую логику» в предложениях where, вот блог темы: предложения SQL WHERE: избегайте CASE, используйте логическую логику

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...