如何在oracle sql的WHERE IN子句中传递变量?

时间:2010-12-16 15:30:08

标签: sql oracle string where-clause

您好
我有一个变量1美元,其中包含逗号分隔的电子邮件地址,如john @ example.com,pat @ example.com。我希望在像

这样的where子句中传递这个变量
where myColumn in ($1)

但显然这不起作用,我尝试了APEX_UTIL.STRING_TO_TABLE和DBMS_UTILITY.COMMA_TO_TABLE但是徒劳无功。

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:4)

正如Pavanred所提到的,最简单的方法 - 尽管不一定是最好的 - 是自己插值。你没有说出你的主叫语言是什么,而是像:

sql = "SELECT something FROM whatever WHERE myColumn in (" + $1 + ")"

但是,这意味着您预先检查$ 1中的所有值以确保它们是数字,或者正确转义的字符串,或者您需要传递的任何其他值但是不能是原始值的非常重要由用户提供,以避免SQL注入。

另一个选择是使其分为两步。首先,将$ 1中的值插入临时表,然后选择这些值作为子查询:

WHERE myColumn in (SELECT temp_value FROM temp_table)

答案 1 :(得分:0)

答案 2 :(得分:0)

它并不漂亮,但您可以实现100%一步到位的SQL注入解决方案。您将“条件”CTE插入到查询中,该查询将逗号分类列表解析为表。然后,您可以在查询中使用它,例如“where column in(select items from criteria)”:

with criteria as
(
    select
        substr(criteria_list, item_start, item_length) as item
    from
    (
        select
            criteria_list,
            comma_pos + 1 as item_start,
            nvl(next_comma_pos - 1, length(criteria_list)) - comma_pos as item_length
        from
        (
            select
                criteria_list,
                comma_pos,
                lead(comma_pos) over(order by comma_pos) as next_comma_pos
            from
            (
                select
                    $1 as criteria_list,
                    instr($1, ',', 1, level) as comma_pos
                from
                    dual
                connect by
                    instr($1, ',', 1, level) > 0 and instr($1, ',', 1, level) <= instr($1, ',', -1)
                union all
                select
                    $1,
                    0
                from
                    dual
            )
        )
    )
)
select * from some_table where column in (select item from criteria)

答案 3 :(得分:0)

一个简单的解决方法,在你的情况下可能足够好(但不是高性能),而是使用LIKE:

select * from something where $1 like '%,'||mycolumn||',%';

$ 1是逗号分隔的列表,作为字符串,前缀和附加逗号,例如。

,foo@bar.com,ammoq@ammoq.com,onemore@whatever.com,