Невозможно передать строковое значение 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) || ',%'
;