选择行或默认行

时间:2014-10-06 14:45:58

标签: sql oracle

我的表格中有以下列 NAMES

|-------------|
|    NAMES    |
|-------------|
| NAME | LANG |
|-------------|

有3种类型的记录:lang = ' en' ,lang = ' ua' 和lang = chr(0)(默认lang)

现在我应该按照下一个条件选择lang的名字:

  1. 如果我按照lang和记录选择此lang存在则应该 被退回

  2. 如果我按照lang和记录选择此lang不存在则默认 应返回NAME(其中lang = chr(0))

  3. 我为此生成了下一个查询,但看起来很糟糕

    SELECT 
       NAME 
    FROM NAMES WHERE 
       LANG = :lang 
       OR (NOT EXISTS(SELECT * FROM NAMES WHERE LANG = :lang) AND LANG = chr(0))
    

    有没有更好的方法来实现这个? (使用Oracle DB)

    示例数据:
    1)

    |--------------|
    |    NAMES     |
    |--------------|
    | NAME | LANG  |
    |--------------|
    | Ivan |  ua   |
    | Kris | chr(0)|
    |--------------|
    

    en 搜索会返回 Kris

    2)

    |--------------|
    |    NAMES     |
    |--------------|
    | NAME | LANG  |
    |--------------|
    | Ivan |  ua   |
    | Kris | chr(0)|
    | Mike |  en   |
    |--------------|
    

    en 搜索会返回 Mike

    3)

    |--------------|
    |    NAMES     |
    |--------------|
    | NAME | LANG  |
    |--------------|
    | Ivan |  ua   |
    |--------------|  
    

    en 搜索

2 个答案:

答案 0 :(得分:3)

使用解码功能实现相同的

WITH language as 
(select count(1) lang_count from names where lang=:lang)
 SELECT 
 A.NAME 
 FROM NAMES a,language 
 where a.lang=decode(language.lang_count,0,chr(0),:lang);

更新1 : - 编写了解决OP提到的第二个案例的答案。结果与OP尝试的结果相同,但可能不太清楚

答案 1 :(得分:2)

我认为以下内容应该更快:

SELECT name FROM
(
   SELECT name, ROW_NUMBER() OVER (PARTITION BY name ORDER BY 
    CASE WHEN lang = :lang  THEN 0 ELSE 1 END) AS rn
   FROM names WHERE lang = :lang OR lang = chr(0)   
)
WHERE rn = 1;