如何解决根据转码表检查两列 - Oracle SQL
我有一张这样的桌子(我称之为 table_1)。列 CODE_CAT 已根据转码表(我将其称为 table_2)
转换为 COD_CAT_1CODE CODE_CAT COD_CAT_1
=============================
UNT KXJE6 jE6
UNT X NULL
UNT XI I
UNT XM M
UNT XeLJ Alj
UNT Y NULL
UNT fX NULL
UNT nX3 3
Table_2 看起来像这样,CODE_CAT & COD_CAT_1 是 CODES_CAT_ORIG(原始代码)和 CODES_CAT_DEST 的串联(目的地代码)代码。
CODES_CAT_ORIG CODES_CAT_DEST
=======================
3 3
e A
f NULL
M M
Y NULL
I I
n B
J j
K S
E E
L l
6 6
X NULL
我正在尝试根据 table_2 比较 CODE_CAT 和 COD_CAT_1 并添加一个带有 'CASE WHEN' 子句来检查转换是否正常。 我想要的结果如下所示。
CODE CODE_CAT COD_CAT_1 CHECK SHOULD_BE
====================================================
UNT KXJE6 jE6 NOT OK SjE6
UNT X NULL OK NULL
UNT XI I OK I
UNT XM M OK M
UNT XeLJ Alj OK Alj
UNT Y NULL OK NULL
UNT fX NULL OK NULL
UNT nX3 3 NOT OK B3
OK 和 NOT OK 的逻辑是
对于每个CODE_CAT,如果所有字符都根据CODES_CAT_ORIG和CODES_CAT_DEST代码在COD_CAT_1中进行了很好的转换table_2。
例如第一个代码KXJE6,我检查:
K => S
X => to nothing ‘’
J => j
E => E
6 => 6
如果是,则应该是 SjE6 并检查 OK 如果不是,则检查不正常
有人可以帮忙吗?
提前致谢!
解决方法
如果我们在 table_2
中使用 TRANSLATE
作为 strings 会更简单一些。我选择 #
字符不存在,并在 CASE
的 NVL
函数中使用它。看看是否有帮助。
SQL> with
2 ta (code_cat,cod_cat_1) as
3 (select 'KXJE6','jE6' from dual union all
4 select 'X','' from dual union all
5 select 'XI','I' from dual union all
6 select 'XM','M' from dual union all
7 select 'XeLJ','Alj' from dual union all
8 select 'Y','' from dual union all
9 select 'fX','' from dual union all
10 select 'nX3','3' from dual
11 )
12 select distinct a.code_cat,a.cod_cat_1,13 translate(a.code_cat,'#3eMInJKEL6fYX','#3AMIBjSEl6') should_be,14 case when nvl(a.cod_cat_1,'#') = nvl(translate(a.code_cat,'#3AMIBjSEl6'),'#') then 'OK'
15 else 'Not OK'
16 end result
17 from ta a
18 order by a.code_cat;
CODE_CAT COD_CAT_1 SHOULD_BE RESULT
---------- ---------- -------------------- ------
fX OK
KXJE6 jE6 SjE6 Not OK
nX3 3 B3 Not OK
X OK
XeLJ Alj Alj OK
XI I I OK
XM M M OK
Y OK
8 rows selected.
SQL>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。