1

下面是我的查询,我将字符串值 1,2 作为绑定值传递,但它显示错误,因为它不是有效数字。我知道 IN 只接受数字,但在这里我需要传递字符串值

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

2 回答 2

1

您可以使用字符串比较而不是 IN 条件。

select ...
from   ...
where  ',' || :emp_id || ',' like '%,' || to_char(emp_id) || ',%'
;
于 2017-06-27T14:10:32.037 回答
1

Inlist of valuesor一起使用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将返回trueif :emp_idis并且这是通过使用函数null故意实现的。decode

于 2017-06-27T11:50:23.930 回答