如何通过传递多个值来参数化SQL查询

时间:2019-07-18 15:27:31

标签: sql oracle oracle11g

我有一个SQL查询,其中where子句“ MID = 123”。我想为VALUE使用参数,并传递多个值。

示例:现在我传递的是123的一个值,但是我想传递多个值,例如123, 124, 125等,SQL查询将从中将多个值一一传递给where子句,并逐个生成结果,例如第一次使用value = 123时获取结果,在使用value = 124时获取结果,最后使用value = 125来获取结果。

我需要有关此参数的帮助。

如果我们不更改SQL查询,但可以在where子句中进行参数设置,那就太好了。

注意:我正在使用SQL Developer。

SQL查询:

SELECT
    'ABC' AS COLUMN_NAME,
    (CASE 
        WHEN to_char(count(ABC)) > 1 
              AND to_char(max(ABC)) = to_char(min(ABC)) 
              AND to_char(count(ABC)) = count(*) 
              AND to_char(max(ABC)) IS NULL 
           THEN 'same' 
           ELSE 'Diff'
     END) AS COMPARISON_VALUE,
    (CASE 
        WHEN to_char(COUNT(ABC)) = 1 OR to_char(min(ABC)) IS NULL 
           THEN 'No Values' 
           ELSE to_char(max(ABC)) 
     END) AS TRANSACTION1,
    to_char(min(ABC)) AS TRANSACTION2
FROM 
    ADVICES 
WHERE 
    MID = '123';

4 个答案:

答案 0 :(得分:0)

您可以将where子句更改为-

WHERE 
MID IN (YOUR_PARAMETER);

当您传递多个值时,它将简单地转换为OR条件并获取结果。

答案 1 :(得分:0)

一种方法是在WITH子句中指定测试数据,然后通过外部联接将其提供给查询。我们将测试值作为结果集中的第一列。这意味着结果集中的每一行都将具有关联的测试值。

WITH testdata(testval) AS
(
  SELECT '123' FROM DUAL UNION ALL
  SELECT '124' FROM DUAL UNION ALL
  SELECT '125' FROM DUAL
)
SELECT
    testdata.testval,
    ...
    ...
FROM 
    ADVICES, testdata
WHERE 
    MID (+) = testdata.testval;
  

...我正在尝试参数where子句,我想为其获取   来自文本或CSV的参数数据应该没问题。

或者,testdata可能是从带有测试值的CSV文件加载的表。

答案 2 :(得分:0)

您可以传递CSV并使用LIKE

where ','||:var||','  like '%,'||MID||',%'

使用HR模式的示例

var myvar VARCHAR2 
exec :myvar := '101,102,103' --parameter
select employee_id,department_id from employees where 
     ','||:myvar||','  like '%,'||employee_id||',%';

结果

EMPLOYEE_ID DEPARTMENT_ID
----------- -------------
        101            90
        102            90
        103            60

答案 3 :(得分:0)

您可以像下面这样编写WHERE子句:

WHERE MID IN
(SELECT
    REGEXP_SUBSTR('YOUR_VALUE', '[^,]+', 1, LEVEL)
FROM
    DUAL
CONNECT BY
    REGEXP_SUBSTR('YOUR_VALUE', '[^,]+', 1, LEVEL) IS NOT NULL);

用于检查解决方案:

-- With multiple values
DEFINE YOUR_VALUE= '123,124,125';
SELECT
    REGEXP_SUBSTR('&YOUR_VALUE', '[^,]+', 1, LEVEL)
FROM
    DUAL
CONNECT BY
    REGEXP_SUBSTR('&YOUR_VALUE', '[^,]+', 1, LEVEL) IS NOT NULL);

-- OUTPUT --

REGEXP_SUBS
-----------
123
124
125


-- With single value
DEFINE YOUR_VALUE = '123';
SELECT
    REGEXP_SUBSTR('&YOUR_VALUE', '[^,]+', 1, LEVEL)
FROM
    DUAL
CONNECT BY
    REGEXP_SUBSTR('&YOUR_VALUE', '[^,]+', 1, LEVEL) IS NOT NULL;

-- OUTPUT --

REGEXP_SUBS
-----------
123

干杯!