这是我的表:
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
答案 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')
但我向你保证凯文伯顿的回答更好:)我投了票:))