Ошибка - однострочный подзапрос возвращает более одной строки - PullRequest
0 голосов
/ 18 июня 2020

Я создал тип таблицы для передачи нескольких идентификаторов сотрудников в мою процедуру. Однако существует требование, если во входной параметр ничего не передано, тогда должны быть получены все сотрудники.

Тип таблицы создан -

CREATE OR REPLACE TYPE EMP_LIST IS TABLE OF NUMBER;  

Я написал ниже запрос, чтобы проверить нулевое значение значение, но не удалось с ошибкой - ORA-01427: однострочный подзапрос возвращает более одной строки

SELECT COL_LIST FROM  EMP
WHERE EMP_ID IN (CASE WHEN (SELECT COLUMN_VALUE FROM table(EMP_LIST())) IS NULL 
                THEN (SELECT EMP_ID FROM EMP) 
                ELSE (SELECT COLUMN_VALUE FROM table(EMP_LIST())) END)

CASE не может возвращать несколько значений. Может ли кто-нибудь предложить альтернативу или любое другое решение для такого сценария?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Если вы хотите использовать этот тип, вы можете написать:

with t as (SELECT COLUMN_VALUE cv FROM table(EMP_LIST()))
SELECT COL_LIST FROM EMP
  where emp_id in (select cv from t) 
     or (select count(1) from t) = 0

dbfiddle

Edit - объяснение:

with t as (SELECT COLUMN_VALUE cv FROM table(EMP_LIST()))

Эта часть называется CTE (общее табличное выражение). Обычно он используется, когда подзапрос требуется в основном запросе дважды или более, как здесь.

  where emp_id in (select cv from t) 

как в вашей попытке (первое использование CTE)

     or (select count(1) from t) = 0

второе использование CTE . Условие WHERE вместе позволяет нам видеть строки, которые находятся в списке, представленном в CTE или все строки , если количество предоставленных чисел равно нулю.

Вы можете сделать это без CTE, но таким образом вам пришлось определять список дважды.

0 голосов
/ 18 июня 2020

Попробуйте что-нибудь подобное в своем предикате

((select count(0) from table(emp_list()))=0 and emp_id IN (
                SELECT
                    emp_id
                FROM
                    emp
            )
            )
 or emp_id in (
                SELECT
                    column_value
                FROM
                    TABLE ( emp_list() )
            )
...