我的表格中有以下列 NAMES :
|-------------|
| NAMES |
|-------------|
| NAME | LANG |
|-------------|
有3种类型的记录:lang = ' en' ,lang = ' ua' 和lang = chr(0)(默认lang)
现在我应该按照下一个条件选择lang的名字:
如果我按照lang和记录选择此lang存在则应该 被退回
如果我按照lang和记录选择此lang不存在则默认 应返回NAME(其中lang = chr(0))
我为此生成了下一个查询,但看起来很糟糕
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 搜索
答案 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;