【问题标题】:SQL fill empty values in a column based on case when selectionSQL在选择时根据大小写填充列中的空值
【发布时间】:2022-01-06 15:12:13
【问题描述】:

所以基本上我想要实现的是,如果四列是空的,一列包含 1 作为值,一列包含 0,那么我想在一列中输入满足默认值(0.06077)条件的条目。

含义:如果 COL_A、COL_B、COL_C、COL_D IS NULL 且 COL_E = 0 AND COL_F = 0 则用默认值 0.06077 填充 COL_A 中满足这些条件的行。

我尝试了以下方法:

, CASE WHEN COL_A IS NULL AND COL_B IS NULL AND COL_C IS NULL AND COL_D IS NULL 
AND COL_E = 0 AND COL_F = 1 THEN NVL(COL_A, 0.06077) END 

以下确实填写了符合我设定条件的条目。有人知道潜在的解决方案吗?

【问题讨论】:

  • “没有用”不是很有帮助;你得到一个错误,或者只是不是你预期的结果?样本数据以及您当前和预期的结果会有所帮助。您希望哪一列为 0,哪一列为 1 尚不完全清楚,所以也许您有错误的方式。 It seems to roughly work though.(当您已经知道 COL_A 为空时,您为什么还要使用NVL()?或者这应该是指不同的列?)
  • 请检查nvl function 的工作原理,然后再次重写您的代码。如果case 表达式的条件计算为TRUE,那么col_a 当然为空,nvl 毫无意义。另请发布整个 SQL 语句,而不是其中的一部分
  • 只使用0.06077 而不是NVL(COL_A, 0.06077),因为COL_ANULL。此外,您可能需要在 CASE epression 中添加 ELSE 部分。

标签: sql oracle plsql case


【解决方案1】:

如果 COL_A、COL_B、COL_C、COL_D 为 NULL 且 COL_E = 0 AND COL_F = 0,则使用默认值 0.06077 填充 COL_A 中满足这些条件的行。

你可能需要这个case 表达式:

case when
  coalesce(COL_A, COL_B, COL_C, COL_D) is null and COL_E = 0 AND COL_F = 1 
  then  0.06077
  else COL_A end as COL_A

例子

with dt as (
select null COL_A, null COL_B, null COL_C, null COL_D, 0 COL_E, 1 COL_F from dual union all
select 1 COL_A, null COL_B, null COL_C, null COL_D, 0 COL_E, 1 COL_F from dual union all
select null COL_A, null COL_B, null COL_C, null COL_D, 0 COL_E, 0 COL_F from dual
)
select 
case when
  coalesce(COL_A, COL_B, COL_C, COL_D) is null and COL_E = 0 AND COL_F = 1 
  then  0.06077
  else COL_A end as COL_A, 
COL_B, COL_C, COL_D, COL_E, COL_F
from dt;

     COL_A COL_B COL_C COL_D      COL_E      COL_F
---------- ----- ----- ----- ---------- ----------
,06077                                0          1
         1                            0          1
                                      0          0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多