2016-10-26 41 views
2

我試圖寫它裏面用SELECT語句DECODE將是這樣的:(Oracle)的SELECT(返回多行)內部DECODE

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

顯然,如果我裏面DECODE select語句返回多於一行我將得到一個異常「ORA-01427:單行子查詢返回多行」。這是公平的。

我期望獲得不止一行,這是目的,我需要爲所有匹配A.name和Value2的項目顯示Value1。像foreach循環,但在DECODE中。

什麼是正確的做法?

更新: 表A:

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

表B:

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

我希望看到什麼:

值1

值1

值2

+0

請出示表定義,樣本數據和預期產出。 – OldProgrammer

+0

請顯示完整查詢。什麼是A和B,它們之間有什麼關係? – Kacper

+0

您可以在B中擁有多個同名的行嗎? – Aleksej

回答

5

在這種情況下,你可能會使用CASE語句:

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