【问题标题】:Unable to pass string value 1,2 as input to an oracle query [duplicate]无法将字符串值 1,2 作为输入传递给 Oracle 查询 [重复]
【发布时间】:2017-11-30 09:25:52
【问题描述】:

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

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

【问题讨论】:

  • 您追求动态列表吗?如果是这样,也许this 对您有用?
  • 恐怕你必须告诉我们更多。我尝试通过 Lazarus 使用字符串绑定变量,没有问题。我猜对了:您想准确地将 1 个字符串值“1,2”传递给此查询?
  • qry.SQL.Text := 'SELECT * FROM BLABLA WHERE BLA IN (:P1)'; qry.ParamByName('P1').AsString := '1,2'; qry.Active:=true;
  • 简单地说,你不能那样做。 Oracle 不允许以逗号分隔的数字列表作为字符串传递。
  • How to load a large number of strings to match with oracle database? 给出了如何使用 Java 将值数组绑定到 Oracle 集合的示例。与该问题相关联的是其他多个处理与该问题类似主题的问题。

标签: oracle bind-variables


【解决方案1】:

Inlist of valuessubqueries 一起使用。

您可以使用以下 hack 将逗号分隔的 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 字符串将转换为返回 3 行的 subquery

因此,对于您的情况,最终结果可能是这样的:

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, '[^,]+'))

请注意,在这种情况下,如果 :emp_idnullIn 将返回 true,这是通过使用 decode 函数故意实现的。

【讨论】:

【解决方案2】:

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

select ...
from   ...
where  ',' || :emp_id || ',' like '%,' || to_char(emp_id) || ',%'
;

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多