2016-10-26 4 views
2

Я пытаюсь написать DECODE заявление с SELECT, внутри него, который будет выглядеть следующим образом:(оракул) SELECT (который возвращает более одной строки) внутри DECODE

SELECT DECODE(A.name, (SELECT name FROM B WHERE id IN (1000,1001)),'Value1','Value2') FROM A 

Очевидно, что если мой оператор выбора в DECODE возвращает более одной строки, я получу исключение "ORA-01427: однострочный подзапрос возвращает более одной строки". Это справедливо.

Я ожидаю получить больше одной строки, это цель, и мне нужно отобразить Value1 для всех элементов, которые соответствуют A.name и Value2 для тех, которые этого не делают. Как петля foreach, но внутри DECODE.

Что это за правильный способ?

Update: Таблица A:

+--------------+--------+ 
|Surname  | Name | 
+--------------+--------+ 
|   Abc| John | 
|   Smith| Piter | 
|   Cook| Ann | 
+--------------+--------+ 

Таблица B:

+--------------+--------+ 
|ID   | Name | 
+--------------+--------+ 
|   1000| John | 
|   1001| Piter | 
|   2003| Ann | 
+--------------+--------+ 

Что я ожидаю увидеть:

Value1

Значение1

Value2

+0

Пожалуйста показать таблицу определения, выборочные данные и ожидаемый результат. – OldProgrammer

+0

, пожалуйста, укажите полный запрос. Что такое A и B и существует ли какое-либо отношение между ними? – Kacper

+0

Можете ли вы иметь более одной строки в B с тем же именем? – Aleksej

ответ

5

В этой ситуации вы могли бы использовать саз:

SELECT 
    CASE WHEN 
      a.name in (select name from b where id in (1000, 1001)) then 'Value1' 
     ELSE 'Value2' 
    END 
FROM a; 
+0

Это именно то, что мне нужно, спасибо! Работала отлично. – Dzhara

2

Вы можете решить эту проблему с внутренним соединением:

-- Test case setup 
CREATE TABLE A(SURNAME, NAME) AS 
SELECT 'Abc', 'John' FROM DUAL UNION ALL 
SELECT 'Smith', 'Piter' FROM DUAL UNION ALL 
SELECT 'Cook', 'Ann' FROM DUAL; 

CREATE TABLE B(ID, NAME) AS 
SELECT 1001, 'John' FROM DUAL UNION ALL 
SELECT 1002, 'Piter' FROM DUAL UNION ALL 
SELECT 2003, 'Ann' FROM DUAL; 

-- Solution 
SELECT CASE WHEN B.ID IN (1001, 1002) 
      THEN 'Value1' 
      ELSE 'Value2' 
     END Value 
    FROM A, B 
WHERE A.NAME = B.NAME 

Результатов:

VALUE 
------ 
Value1 
Value1 
Value2