我不是SQL中最好的,所以对不起,如果我问愚蠢的问题:)
我们有一个这样的表:
|id| name | nickname | |==|========|============| | 1| Jo| Banana| | 2|Margaret|The Princess| | 3| Perry| The Monkey| | 4|Margaret| The Queen| | 5| | The Rat| | 6| | The Cat|
哪里nickname
总是独一无二的.
而我正试图得到这样的结果:
|id| name | nickname | display_name | |==|========|============|=======================| | 1| Jo| Banana| Jo| | 2|Margaret|The Princess|Margaret (The Princess) | 3| Perry| The Monkey| Perry| | 4|Margaret| The Queen| Margaret (The Queen)| | 5| | The Rat| The Rat| | 6| | The Cat| The Cat|
基本上逻辑是:
如果name
是空的那么display_name = 'nickname'
如果name
是独一无二的话display_name = 'name'
如果name
是not_unique那么display_name = 'name (nickname)'
我只能使用一个SQL查询来实现它吗?如果是这样 - 怎么样?如果不是 - 有哪些替代方案?
目前我使用我的编程语言,但我必须为结果的每一行发送另一个SQL查询,以检查是否有其他记录具有相同的名称,对于过滤结果是可以的,但在检索整个表时太贪心(4 000行和增长).
您可以使用窗口函数版本COUNT()
来确定name
给定行是否唯一,而不执行子查询.例如:
SELECT id, name, nickname, CASE WHEN ISNULL(name, '') = '' THEN nickname WHEN (COUNT(*) OVER (PARTITION BY name)) = 1 THEN name ELSE name + ' (' + nickname + ')' END AS display_name FROM my_table