【问题标题】:Fill adjacent column rows if null如果为空,则填充相邻的列行
【发布时间】:2014-08-21 08:53:30
【问题描述】:

我有一个疑问。我正在处理一组类似于下表的数据:

╔══════╦═══════════╗
║ Col1 ║   Col2    ║
╠══════╬═══════════╣
║    1 ║ NULL      ║
║    2 ║ NULL      ║
║    3 ║ NULL      ║
║    4 ║ AAAAAAAAA ║
║    5 ║ NULL      ║
╚══════╩═══════════╝

我需要找到一种方法来使用非 NULL Col2 值填充 Col2 中的所有 NULL 值。所以查询的结果应该用AAAAAAAAA填充所有5行,只要至少有1个非NULL值。

编辑:不必是AAAAAAAAA 来真正填充剩余的行。它可以是任何东西,只要有某种方法可以确定集合中至少有 1 个非空值。

【问题讨论】:

  • 如果其中两行的col2 具有不同的非NULL 值,会发生什么?例如,如果col2 在第一行是BBBBBBB,你会期待什么?
  • 您的意思是“用非 NULL 的 'col1' 值填充 'col2' 中的所有 NULL 值。” ?
  • @StefanWinkler 只要至少有 1 个非空值,那么就需要有一些标识符表明集合中有一个非空值。因此,如果有 BBBBBBBB 和 AAAAAA,那么它仍然可以通过测试。将值更改为什么并不重要 - 如果通过测试,将所有内容更改为不同的值可能会更好,例如“xyz”。这也有效。
  • @ConradFrix SQL 服务器,是的,语法可能略有不同,但逻辑相似。
  • @TarikZouine 没有。需要有某种方法来确定第 2 列中是否存在非空值。

标签: sql sql-server database tsql


【解决方案1】:

如果我理解正确,您需要:

  1. 从您的表中获取col2 中的非空值,然后
  2. 将col2中的所有空值设置为上一步获取的值

如果是这样,那么我认为这可能会对您有所帮助:

-- I am assuming that there's only one not-null value in col2
set @value = (select col2 from yourTable where col2 is not null limit 1);
update yourTable
    set col2 = @value
    where col2 is null;

【讨论】:

    【解决方案2】:

    以下内容应该可以在 MySQL 或 SQL Server 中使用:

    update table t
        set col2 = (select x from (select max(col2) as x from table t where col2 is not null) t)
        where col2 is null;
    

    【讨论】:

    • 我喜欢子查询中的最大想法。但我不需要使用 SET 永久更新表。我在想一些类似案例陈述的事情。
    【解决方案3】:

    不确定我是否理解您的需求,但...

    UPDATE t SET col2 = (SELECT col2 FROM t where col2 is not null LIMIT 1) WHERE col2 is null 
    

    【讨论】:

      【解决方案4】:

      如果您想要一个 case 语句并且不需要永久更改表(假设您只是希望更改它的输出),只需执行以下操作:

      SELECT
         col1,
         col2 = case
             WHEN exists(select col2 from table where col2 is not null) then 'dummyVal'
              else col2 end
      FROM table
      

      如果您需要将虚拟值作为表中的某个实际值,为什么不直接使用 max 或 min 函数,它们都会忽略空值。

      SELECT
          col1,
          col2 = max(col2)
      FROM table
      

      【讨论】:

        【解决方案5】:
        select table1.col1, COALESCE(table1.col2, 'xyz') 
          from table as table1 
        

        【讨论】:

        • 合并只会将非空值更改为“xyz”,对于所有这些,无论如何。如果其中有一个非空值,我只希望这些值发生变化。许多实例仅由 NULLS 组成,这与我上面的示例相反,其中有 4 个空值和一个 'AAAAAAAAA' 值。
        • 如果你只是在问题中写下你想要的东西会容易得多。而你对我来说没有意义。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        相关资源
        最近更新 更多