Oracle 在 IN 条件中使用字符串

Posted

技术标签:

【中文标题】Oracle 在 IN 条件中使用字符串【英文标题】:Oracle use a string inside IN condition 【发布时间】:2016-09-02 10:22:15 【问题描述】:

我有一个使用 IN 条件的 select 语句,并且在 IN 条件内我有一个字符串...如何忽略单引号?

Select * from employ where id = 12 and org_id in ($id)
$id = '12,13'

谢谢

【问题讨论】:

【参考方案1】:

incollections 一起使用,因此您的输入字符串首先应转换为collection(通过分成行,基于逗号分隔符)

试试这样的

Select * from employ where id = 12 and org_id in (
SELECT decode(:input_id,null,  (select  employ.org_id from dual) 
,TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)) )  
    FROM (SELECT  :input_id temp FROM DUAL)
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')
    )

顺便说一句,如果:input_idnull,这个org_id in () 将返回true

另一种方法是首先将整个查询构造为字符串,然后使用execute immediate 或通过php 执行它。然而,这可能会引起sql injection 的担忧。

【讨论】:

【参考方案2】:

我猜你想处理一个列表。不幸的是,SQL 不允许参数是列表,因此您必须做更多的工作。

一种方法使用like(或正则表达式):

Select *
from employ
where id = 12 and
      ',' || org_id || ',' like '%,' || $id || ',%';

如果性能是一个问题并且您想使用索引,您可能需要研究其他选项。最简单的就是省去参数,只修改查询字符串(使用动态SQL执行查询)。

【讨论】:

问题是当您在 IN 函数中使用 '12,13' 时,您会得到无效的数字......因为 IN 函数将 12 和 13 读取为单个数字.....跨度> “无效数字”表示输入的数字无效。 IN 是一个条件,而不是一个函数。编译器(不是 IN)读取 '12,13' 的确切含义,是一个字符串,而不是一个数字。这会引发“无效号码”错误。

以上是关于Oracle 在 IN 条件中使用字符串的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用Java代码在sql语句(Oracle)的IN子句中传递字符串列表吗

oracle的update .... where id in ('','','')优化问题

oracle中如何使用like来进行模糊匹配

IN() 子句 oracle PLSQL 中的数组

Oracle

如何在条件与数字之间使用 Oracle 中的字符串列