【问题标题】:Getting two columns out of a single column with case statement使用 case 语句从单列中获取两列
【发布时间】:2021-07-07 09:01:49
【问题描述】:

我有一张桌子,上面有人的语言。任何人都可以说英语、西班牙语或英语和西班牙语。在前两种情况下,每个 person_id 有一行,在第二种情况下,我有两行。

我需要在另一个表中使用这些数据,但我只能为每个人保留一个唯一的行。在我的情况下,正确的解决方案是创建两列:

Select
 person_id,
 case when person_language = 'English' then person_language end as "english_language",
 case when person_language = 'Spanish' then person_language end as "spanish_language"
from person_table;

这会将正确的数据放入右列,但英语和西班牙语分别显示在两个单独的行中,在另一个语言列中具有 NULL 值。关于如何解决这个问题的任何想法?

【问题讨论】:

标签: sql oracle


【解决方案1】:

你可以使用聚合:

Select
 person_id,
 max(case when person_language = 'English' then person_language end) as "english_language",
 max(case when person_language = 'Spanish' then person_language end) as "spanish_language"
from person_table
group by person_id;

这也可以使用pivot 语法来完成:

select person_id, english_language, spanish_language
from person_table
pivot (
  max(person_language) as language
  for (person_language) in ('English' as english, 'Spanish' as spanish)
)
order by person_id;

但它的底层机制是一样的。

db<>fiddle

【讨论】:

  • 非常感谢!两者中哪一个将最快实施?它将进入一个视图,其中包含许多行以及对其他表的连接和依赖项
  • Pivot 无论如何都会在后台转换为聚合,所以我怀疑会有很大的不同。如果您有很多值或需要添加值,Pivot 可能更容易维护,但我会使用对您最有意义的那个。
猜你喜欢
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多