情况是这样的。
假设有一个包含几列的表:
| ID|名称|语言|......这是什么?|
| --|--|--|--|
| 1 |鲍勃|ES|......这是什么?|
| 2 |鲍勃|EN|......这是什么?|
| 3 |鲍勃|DE|......这是什么?|
| 4 |法案|EN|......这是什么?|
| 5 |杰克|EN|......这是什么?|
| 6 |杰克|DE|......这是什么?|
| 7 |杰克|ES|......这是一个问题。|
给定一种特定的语言,我想选择所有的ID。如果语言不可用,我想默认为EN。因此,作为一个示例,我为ES选择,我想得到:
| ID|名称|语言|......这是什么?|
| --|--|--|--|
| 1 |鲍勃|ES|......这是什么?|
| 4 |法案|EN|......这是什么?|
| 7 |杰克|ES|......这是什么?|
如果我选择EN,我希望得到:
| ID|名称|语言|......这是什么?|
| --|--|--|--|
| 2 |鲍勃|EN|......这是什么?|
| 4 |法案|EN|......这是什么?|
| 5 |杰克|EN|......这是什么?|
最多可以有10种不同的语言,总共有近50万行。大约有9万个不同的名字。
现在我找到了一个使用COALESCE的选项,但是这需要对每一行进行2次查询。
但是有没有更有效的方法来做到这一点呢?比如:SELECT..... WHERE language =('ES' AND IF NOT EXIST THEN 'EN)。
谢谢.
**Edit:**COALESCE方法不起作用。首先,它只能返回一列,其次,它只能返回一行。
3条答案
按热度按时间oo7oh9g91#
您可以使用DISTINCT ON:
字符串
rhfm7lfc2#
**编辑:**我错过了PostgreSQL标签--原来的答案是在MS SQL中。我下载了PostgreSQL并改编了它。
通常,我联接到一个用户表,并在此响应中模拟了这一点。
获取所有用户,将他们连接到语言表,然后在缺少所需语言的情况下使用case语句进行回退。
字符串
与ES
| 名称|使用语言|
| --|--|
| 鲍勃|ES|
| 法案|EN|
| 杰克|ES|
与EN
| 名称|使用语言|
| --|--|
| 鲍勃|EN|
| 法案|EN|
| 杰克|EN|
==就像我在你的问题中看到的那样==
在这里,您获取每个人的默认值,然后返回并将每个人与没有选定语言的EN默认值联合起来。
型
vcudknz33#
主要答案
为了模拟/复制问题,我创建了以下临时表:
字符串
我们至少执行两次过滤操作:一次针对所选语言,一次针对默认语言。因此,我认为创建一个函数而不是一遍又一遍地重复查询是有意义的:
型
COALESCE返回第一个非NULL值。在我们的问题中,它返回特定用户的第一个可用id和语言。
奖金
假设有两种默认语言。因此,如果此人不会说所选语言或第一种默认语言,则显示第二种默认语言。使用相同的方法:
型
通过创建一个函数,我们保存了我们自己的重复编写,我们使查询更具可读性。