Oracle

基於 trim 獲取重複記錄的 SQL 查詢

  • May 17, 2019

我有一張桌子,上面有以下記錄。

UNMASK  MASK
123 897609
00123   896509
0000456 5632789
456 32567889
5678    5632789

從上表中,我只需要選擇以下記錄。

 UNMASK    
123 
00123   
0000456 
456 

(IE) UNMASK 中的任何值在 ‘1-9’ 之前有任意數量的 ‘0’ 以及在 1-9 之前沒有 0 的行。

像 123 一樣,可以有 000000123、456 和 00456,我需要在 Oracle 中使用 SQL 查詢在輸出中使用這樣的記錄(僅以 0 和原始值為前綴)。

我嘗試了以下查詢,但它沒有按我想要的方式工作。

Select UNMASK,TRIM (LEADING '0' FROM UNMASK) from HSA.TEST_TABLE group by UNMASK having count(TRIM(LEADING '0' FROM UNMASK)) > 1;

測試數據:

create table test_table(unmask varchar(20), mask varchar(20));
insert into test_table values('123', '897609');
insert into test_table values('00123','896509');
insert into test_table values('0000456','5632789');
insert into test_table values('456','32567889');
insert into test_table values('5678','5632789');

我用 CTE 完成了這項工作,因為我愛他們。cast將字元串設置為 anumber會刪除前導字元,我發現這比弄亂TRIM.

詢問:

with duplicates as 
(
 select cast(unmask as number) as unmask_num, count(*) as cnt
 from test_table
 group by cast(unmask as number)
 having count(*)>1
)
select *
from duplicates
join test_table on duplicates.unmask_num = cast(unmask as number)
;

展示的 DB Fiddle在這裡

引用自:https://dba.stackexchange.com/questions/238336