【问题标题】:Merging two rows to one while replacing null values在替换空值时将两行合并为一
【发布时间】:2011-03-16 20:12:30
【问题描述】:

假设我有以下数据库表

Name | Nickname | ID
----------------------
Joe    Joey       14
Joe    null       14

现在我想做一个选择语句,将这两列合并为一列,同时替换空值。结果应如下所示:

Joe, Joey, 14

哪个 sql 语句管理这个(如果可能的话)?

【问题讨论】:

  • 结果应该是“Joes”还是“Joe”?
  • 按哪一列合并行?例如,如果您将有第三行 XXX,null,10。您的查询应该返回什么?
  • 它可能会返回错误。我预计只会找到两行。
  • 我认为您可以使用下一个条件“昵称不为空”编写查询,它会返回您想要的内容。它只是不选择具有空昵称的行。
  • @Bernhard,Joe 会有多个昵称吗?如果有,您希望如何处理它们?

标签: sql oracle select


【解决方案1】:

最简单的解决方案:

SQL> select * from t69
  2  /

NAME       NICKNAME           ID
---------- ---------- ----------
Joe        Joey               14
Joe                           14
Michael                       15
           Mick               15
           Mickey             15

SQL> select max(name) as name
  2         , max(nickname) as nickname
  3         , id
  4  from t69
  5  group by id
  6  /

NAME       NICKNAME           ID
---------- ---------- ----------
Joe        Joey               14
Michael    Mickey             15

SQL>

如果您有 11gR2,您可以使用 the new-fangled LISTAGG() function,但否则将上述语句包装在连接 NAME 和 NICKNAME 列的 SELECT 中很简单。

【讨论】:

  • 精彩回答
【解决方案2】:

阿法伊克, 这个问题还不清楚。所以我在这里做一些假设。 您的输出具有相同的两行的第一列和第三列。 只有第二个字段不同。

所以你可以简单地写一个选择任务

select one.name,two.nick_name,one.id from 
(select name,id from your_tb group by name,id) one,
your_tb two 
where two.nickname is not NULL 
and two.name=one.name 
and two.id=one.id;

也许我们可以调整这个,但我不擅长调整 sql 查询,但这是我想你需要的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2014-08-13
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多