【发布时间】:2022-01-11 11:57:33
【问题描述】:
我想根据以下条件将翻译表左连接到表 1: 如果翻译表中有浏览器语言项,请选择此项。如果没有检查是否有操作系统语言的项目,如果没有则选择默认(空)语言。
表1
| id | item |
|---|---|
| 0 | tax |
| 1 | fee |
翻译
| id | item | language | text |
|---|---|---|---|
| 0 | tax | NULL | Steuer |
| 1 | tax | de | Steuer |
| 2 | tax | en | tax |
| 3 | fee | NULL | Gebühr |
| 4 | fee | de | Gebühr |
| 5 | fee | en | charge |
SELECT * FROM table1 t1
LEFT JOIN translation t2 ON t1.item = t2.item;
会给我所有的东西,比如:
结果
| id | item | id | item | language | text |
|---|---|---|---|---|---|
| 0 | tax | 3 | tax | NULL | Gebühr |
| 0 | tax | 4 | tax | de | Gebühr |
| 0 | tax | 5 | tax | en | charge |
| 1 | fee | 0 | fee | NULL | Steuer |
| 1 | fee | 1 | fee | de | Steuer |
| 1 | fee | 2 | fee | en | tax |
我的方法是使用 CASE 但查询:
DECLARE @uiLanguage VARCHAR(2) = 'en';
DECLARE @osLanguage VARCHAR(2) = 'de';
SELECT
*
FROM
item t1
LEFT JOIN translation t2 ON t1.item = t2.item
WHERE
t2.language = (CASE
WHEN t2.language = @uiLanguage THEN @uiLanguage
ELSE @osLanguage
END);
给我这个结果:
结果
| id | item | id | item | language | text |
|---|---|---|---|---|---|
| 0 | tax | 4 | tax | de | Gebühr |
| 0 | tax | 5 | tax | en | charge |
| 1 | fee | 1 | fee | de | Steuer |
| 1 | fee | 2 | fee | en | tax |
这是应该或需要的:
结果
| id | item | id | item | language | text |
|---|---|---|---|---|---|
| 0 | tax | 5 | tax | en | charge |
| 1 | fee | 2 | fee | en | tax |
【问题讨论】:
-
在
WHERE子句中使用t2上的过滤器,使用LEFT JOIN毫无意义 - 结果集中在t2中没有匹配行的任何行都将被过滤掉WHERE子句,因为NULL永远不等于任何东西。您是不是要将过滤器放在JOIN条件中? -
请编辑您的问题并为您的 RDBMS 添加正确的tag
-
在 where/on 中使用 AND/OR 而不是 case 表达式通常会更好。