как передать переменную в предложении WHERE IN оракула sql? - PullRequest
5 голосов
/ 16 декабря 2010

Привет
У меня есть переменная $ 1, которая содержит адреса электронной почты через запятую, такие как john @ example.com, pat @ example.com.Я хочу передать эту переменную в предложении where, например

where myColumn in ($1)

Но, очевидно, это не сработает, я попробовал APEX_UTIL.STRING_TO_TABLE и DBMS_UTILITY.COMMA_TO_TABLE, но тщетно.

Любая помощь приветствуется.

Ответы [ 4 ]

4 голосов
/ 16 декабря 2010

Как намекал Паванред, самый простой способ - хотя и не обязательно лучший - это интерполировать значения самостоятельно.Вы не говорите, что ваш язык вызова, но что-то вроде:

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

Однако это означает, что очень важно, чтобы вы предварительно проверили все значения в $ 1, чтобы убедиться, что они либо числаили правильно экранированные строки, или что-либо еще, что вам нужно передать, но не может быть необработанными значениями, предоставленными пользователем, чтобы избежать внедрения SQL.

Другой вариант - сделать его двухэтапным процессом,Сначала вставьте значения из $ 1 во временную таблицу, затем выберите эти значения как подзапрос:

WHERE myColumn in (SELECT temp_value FROM temp_table)
0 голосов
/ 17 декабря 2010

Простой обходной путь, который может быть достаточно хорош в вашем случае (но не эффективен), состоит в том, чтобы вместо этого использовать LIKE:

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

$ 1 - это список, разделенный запятыми, в виде строки с запятой и добавлением запятой, например,

,foo@bar.com,ammoq@ammoq.com,onemore@whatever.com,
0 голосов
/ 17 декабря 2010

Это не красиво, но вы можете получить 100% одношаговое SQL-решение, защищающее от инъекций, подобное этому.Вы включаете CTE «критерий» в свой запрос, который анализирует список с запятыми в таблице.Затем вы можете использовать его в запросе типа «где столбец (выбрать элемент из критериев)»:

<code>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)
0 голосов
/ 16 декабря 2010

Взгляните на этот пост в блоге: Использование списка в запятой SQL-запроса .

...