Невозможно передать строковое значение 1,2 в качестве ввода в запрос оракула

Ниже мой запрос, и я передаю строковое значение 1,2 в качестве значения привязки, но оно показывает ошибку, поскольку это недопустимое число. Я знаю, что IN принимает только число, но здесь мне нужно передать строковое значение

SELECT  e.*
FROM    employee_detail e
WHERE   e.emp_id IN (:emp_id)

2 ответа

In используется с list of values или же subqueries,

Вы можете конвертировать запятую в отдельности string в subquery, используя следующий хак:

 SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level))   
    FROM (SELECT  :emp_id temp FROM DUAL)
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')

Здесь 1,2,3 жало будет преобразовано в subquery это возвращает 3 строк.

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

SELECT  e.*
FROM    employee_detail e
WHERE   e.emp_id in (
SELECT decode(:emp_id,null,  (select  e.emp_id from dual) 
,TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)) )  
    FROM (SELECT  :emp_id temp FROM DUAL)
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+'))

Обратите внимание, что в этом случае In вернусь true если :emp_id является null и это было сознательно достигнуто с помощью decode функция.

Вы можете использовать сравнение строк вместо условия IN.

select ...
from   ...
where  ',' || :emp_id || ',' like '%,' || to_char(emp_id) || ',%'
;
Другие вопросы по тегам