IF EXIST子句

时间:2011-11-23 09:39:27

标签: sql oracle

这是我的表:

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

我想要一个返回单行的select查询 如果COUNTRY_CODE_2D = 'CA'(有效数据)返回第二行,否则返回COUNTRY_CODE_2D =null and TYPE_ID=17

所在的第3行

3 个答案:

答案 0 :(得分:2)

如果您可以在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'
)

或没有连接(并且因为它不使用oracle表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 :(得分:1)

感谢Kevin,Florin的帮助。

凯文,你给我的第二个问题有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);

答案 2 :(得分:0)

没有显式连接的示例:

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')

但我向你保证凯文伯顿的回答更好:)我投了票:))