如何检查oracle中列的所有值是不是相同

Posted

技术标签:

【中文标题】如何检查oracle中列的所有值是不是相同【英文标题】:How to check if all values of column are same in oracle如何检查oracle中列的所有值是否相同 【发布时间】:2021-09-11 01:58:27 【问题描述】:

我有一个源表(Oracle DB),其中包含以下示例数据,我想从中检查特定列(col3)的值是否与 column1 相同。如果是这样,则将新字段填充为“Y”否则为“N”。

Sample source table
SRC_TABLE
col1    col2        col3    col4    col5    ....colx
-----   ---------   ------  ----    -----   --------
ID001   SUPLIER_1   121.00  abc     123     ...
ID001   SUPLIER_2   100     abc     123     ...
ID001   SUPLIER_3   201.12  abc     123     ...

ID002   SUPLIER_1   150.00  abc     123     ...
ID002   SUPLIER_3   150     abc     123     ...

从上表中,我想检查给定 col1 组的 col3 是否相同,如果它们相同,则填充为“Y”,否则为“N”,如下面的 New_Field 列所示。

col1    col2        col3    col4    col5    ....colx    New_Field
-----   ---------   ------  ----    -----   --------    ---------
ID001   SUPLIER_1   121.00  abc     123     ...         N
ID001   SUPLIER_2   100     abc     123     ...         N
ID001   SUPLIER_3   201.12  abc     123     ...         N
                                                        
ID002   SUPLIER_1   150.00  abc     123     ...         Y
ID002   SUPLIER_3   150     abc     123     ...         Y

我无权在源中操作更改,我想根据源数据得出计算并加载到目标中。我尝试使用 group by 同时从源中获取数据以及 select 语句,但由于不是 group by 表达式而出现错误。非常感谢任何有助于实现所需输出的帮助。谢谢!

select
    col1,
    col2,
    col3,
    col4,
    .
    .
    .
    .
    colx,
    case when count(distinct col3) > 1 then 'N' else 'Y' end as new_field
from src_table
group by col1,col2,col4,col5...colx

在 group by 子句中添加 new_field 会返回无效标识符错误,如果我通过得到 not a group by expression 错误将其从组中删除,如上所示。不知道如何得到想要的结果。

【问题讨论】:

您需要在 Group by 中添加 col3 而不是 new_field。 【参考方案1】:

我想你想要一个窗口函数。

select
    src_table.*,
    case when count(*) over (partition by col1, col3) = 1 then 'N' else 'Y' end as new_field
from src_table

在这种情况下,窗口分区是您希望唯一的值(col1 和 col3),因此该窗口上的 count(*) 将返回您在表中的重复行数(对于特定的 col1+ col3 组合)。

我注意到你有 150150.00 作为值,所以你可能需要做 (partition by col1, to_number(col3))

【讨论】:

谢谢@kfinity...但是似乎这并没有给出期望的结果,因为分区已被用于 col1 & col3 这导致例如如果 col1 具有相同的值而 col3 具有不同的值,例如在col1 as ID003 and col3 as 100,100,120 下方,它给了我 col3 120 条目的 Y 和 col3 100 的其余条目的 N。只需使用以下 sn-p 即可获得@syan @syan case when count(distinct col3) over (partition by col1) = 1 then 'Y' else 'N' end 建议的所需结果【参考方案2】:

正如上面@kfinity所说,你真的可以使用解析窗口函数count()over得到它,但是使用count(distinct col3) over(partition by col1)而不是count(*) over(partition by col1,col3)

select
   s.*
  ,case count(distinct col3)over(partition by col1)
     when 1 then 'Y' 
     else 'N' 
   end as new_field
from SRC_TABLE s;

带有样本数据的完整测试用例:

with SRC_TABLE(col1,col2,col3,col4,col5) as
(
select 'ID001','SUPLIER_1',121.00, 'abc',123 from dual union all
select 'ID001','SUPLIER_2',100   , 'abc',123 from dual union all
select 'ID001','SUPLIER_3',201.12, 'abc',123 from dual union all
select 'ID002','SUPLIER_1',150.00, 'abc',123 from dual union all
select 'ID002','SUPLIER_3',150   , 'abc',123 from dual union all

select 'ID003','SUPLIER_1',100   , 'abc',123 from dual union all
select 'ID003','SUPLIER_2',100   , 'abc',123 from dual union all
select 'ID003','SUPLIER_3',201.12, 'abc',123 from dual 
)
select
   s.*
  ,case count(distinct col3)over(partition by col1)
     when 1 then 'Y' 
     else 'N' 
   end as new_field
from SRC_TABLE s;

结果:

COL1  COL2            COL3 COL       COL5 N
----- --------- ---------- --- ---------- -
ID001 SUPLIER_2        100 abc        123 N
ID001 SUPLIER_1        121 abc        123 N
ID001 SUPLIER_3     201.12 abc        123 N
ID002 SUPLIER_1        150 abc        123 Y
ID002 SUPLIER_3        150 abc        123 Y
ID003 SUPLIER_1        100 abc        123 N
ID003 SUPLIER_2        100 abc        123 N
ID003 SUPLIER_3     201.12 abc        123 N

8 rows selected.

【讨论】:

以上是关于如何检查oracle中列的所有值是不是相同的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pyarrow 更改镶木地板文件中列的名称?

如果我有两列,我如何选择列的所有不同值,其中列永远不是特定值,因为 columnA 是相同的值?

oracle中如何把表中具有相同值列的多行数据合并成一行

如何检查numpy矩阵的列中的所有值是不是相同?

如何使用 django 查询检查数据库字段的所有值是不是相同

代码优先迁移中列的 EF6 Oracle 默认值