IF EXIST пункт - PullRequest
       8

IF EXIST пункт

1 голос
/ 23 ноября 2011

Это моя таблица:

ID      COUNTRY_CODE_3D     COUNTRY_CODE_2D      TYPE_ID    
 1          "IND"            "IN"                  11           
 2          "CAN"            "CA"                  13           
 3           null            null                  17

Я хочу запрос на выборку, который вернет одну строку, если COUNTRY_CODE_2D = 'CA' (действительные данные) вернут 2-ю строку, иначе вернут 3-ю строку, где COUNTRY_CODE_2D =null and TYPE_ID=17

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Если вы можете поместить функциональный индекс для country_code_2d, (NVL(country_code_2d,'EMPTY'))

CREATE INDEX fidx_empty_null ON country_cnfg_tbl (NVL(country_code_2d,'EMPTY'));

, тогда вы можете

SELECT * FROM country_cnfg_tbl a
WHERE NVL(a.country_code_2d,'EMPTY') IN 
(  
    SELECT NVL(b.country_code_2d,'EMPTY') FROM dual d
    LEFT JOIN country_cnfg_tbl b on b.country_code_2d = 'CA'
)

или без объединений (и более переносимых, как это делаетсяне использовать оракул стол DUAL)

SELECT * FROM country_cnfg_tbl a WHERE NVL(a.country_code_2d,'EMPTY') IN  
(       
    SELECT CASE WHEN count(*) = 0 THEN 
                'EMPTY' 
           ELSE 
                b.country_code_2d 
           END as country_code_2d  
    FROM country_cnfg_tbl b 
    WHERE b.country_code_2d = 'CA'
    GROUP BY b.country_code_2d
)
1 голос
/ 25 ноября 2011

Спасибо, Кевин, Флорин, за вашу помощь.

Кевин, во втором запросе, который вы мне дали, была 1 ошибка.Но я кое-что изменил, и теперь он работает нормально, Кевин, спасибо за ценный вклад, продолжайте в том же духе:)

Это последний запрос:

SELECT * FROM country_cnfg_tbl a WHERE NVL(a.country_code_2d,'EMPTY') IN
(SELECT 
CASE
WHEN (select count(*) FROM country_cnfg_tbl WHERE country_code_2d IN ('CA') OR country_code_2d IS NULL) = 1  THEN 'EMPTY'  ELSE country_code_2d
END as country_code_2d  FROM country_cnfg_tbl WHERE country_code_2d IN ('CA') OR country_code_2d IS NULL);
0 голосов
/ 24 ноября 2011

Пример без явных объединений:

SELECT 
  * 
FROM 
  country_cnfg_tbl 
WHERE 
  nvl(country_code_2d,'xxx') 
   = 
  (select nvl(country_code_2d,'xxx') 
   from country_cnfg_tbl 
   where country_code_2d='CA')

Но я вас уверяю, что ответ Кевина Бертона лучше :) Я проголосовал за него:))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...