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】:in
与collections
一起使用,因此您的输入字符串首先应转换为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_id
是null
,这个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子句中传递字符串列表吗