SQL (Oracle) использует два определенных списка в выражении where - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь создать запрос, в котором я использую два предопределенных списка с несколькими значениями в качестве фильтров для доли участия. Это позволяет легко повторно использовать запрос для многих пар значений и многих пар значений.

На Stackoverflow я нашел:

    WITH MyListOfValues(col1) AS (
  select 'MyValue1' from dual union
  select 'MyValue2' from dual union
  select 'MyValue3' from dual 
)
SELECT * 
FROM DatabaseTable  
WHERE Column in (
  select col1
  from  MyListOfValues);

Hoverver это терпит неудачу, когда я делаю что-то вроде:

    WITH MyListOfValues1(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        )
    AND
    WITH MyListOfValues2(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        )
        SELECT * 
        FROM DatabaseTable  
        WHERE Column1 in (
          select col1
          from  MyListOfValues1)
        AND Column2 in (
          select col1
          from  MyListOfValues2);

У кого-нибудь есть решение? :) Я делаю это в корпоративной среде размещения. У меня нет прав (насколько я знаю) создавать свои собственные таблицы.

Надеюсь, ты поможешь мне! Мы будем благодарны за любую помощь: -)

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Я бы использовал exits вместо

WITH MyListOfValues1(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        ),
     MyListOfValues2(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        )
SELECT * 
FROM DatabaseTable dt  
WHERE EXISTS (SELECT 1 FROM MyListOfValues1 WHERE col1 = dt.Column1) AND
      EXISTS (SELECT 1 FROM MyListOfValues2 WHERE col1 = dt.Column2);
0 голосов
/ 01 мая 2018

Используйте коллекцию и оператор MEMBER OF

SYS.ODCIVARCHAR2LIST - это встроенный VARRAY, который вы можете использовать:

SELECT * 
FROM DatabaseTable  
WHERE Column1 MEMBER OF SYS.ODCIVARCHAR2LIST( 'MyValue1', 'MyValue2', 'MyValue3' )
AND   Column2 MEMBER OF SYS.ODCIVARCHAR2LIST( 'MyValue1', 'MyValue2', 'MyValue3' );

Или вы можете определить свою собственную коллекцию:

CREATE TYPE StringList IS TABLE OF VARCHAR2(20);

SELECT * 
FROM DatabaseTable  
WHERE Column1 MEMBER OF StringList( 'MyValue1', 'MyValue2', 'MyValue3' )
AND   Column2 MEMBER OF StringList( 'MyValue1', 'MyValue2', 'MyValue3' );

Вы даже можете передавать коллекции как переменные связывания:

SELECT * 
FROM DatabaseTable  
WHERE Column1 MEMBER OF :List1
AND   Column2 MEMBER OF :List2;
0 голосов
/ 01 мая 2018

У вас есть синтаксическая ошибка. Правильный синтаксис для CTE:

WITH MyListOfValues1(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        ),
     MyListOfValues2(col1) AS (
          select 'MyValue1' from dual union
          select 'MyValue2' from dual union
          select 'MyValue3' from dual 
        )
SELECT * 
FROM DatabaseTable  
WHERE Column1 in (select col1 from  MyListOfValues1) AND
      Column2 in (select col1 from  MyListOfValues2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...