使用SUBSTR删除前几个和最后几个字符,然后比较表列值

时间:2015-11-11 21:12:00

标签: sql oracle oracle-sqldeveloper

我正在寻找帮助,找出两个不同表中两列之间的不一致。

Table1有ColumnA

Table2有ColumnB

ColumnA和ColumnB具有在比较之前需要先删除的值,例如

ColumnA = TZ-ZA112
ColumnA = TZ-RT322
ColumnA = TZ-JKAAA
ColumnB = TZ-ZA112,-2
ColumnB = TZ-HHASS,-4
ColumnB = TZ-RT322,4-

基本上,我需要在比较之前删除TZ-(前三个)和##(后三个),然后我需要让查询吐出任一列中不存在的值。那么输出应该是什么

HHASS
JKAAA

老实说,我无法将SUBSTR和INSTR结合在一起,同时组合这些表来产生这个输出。

2 个答案:

答案 0 :(得分:1)

假设您始终需要从columnA和B列中的第4个字符开始,并且需要获取npm i azure-cli -g,直到azure storage cors set -a "storage-account" -k "storage-account-key" --blob/table/queue/file --cors "[{\"AllowedOrigins\":\"*\",\"AllowedMethods\":\"GET\",\"MaxAgeInSeconds\":\"86400\",\"AllowedHeaders\":\"*\",\"ExposedHeaders\":\"*\"}]" 字符,下面的代码才会起作用。

要获取不在columnA和columnB中的值,请使用substr。对于不在columnB和columnA中的值,必须重复此操作。最后,执行,以获得所需的结果。

minus

答案 1 :(得分:0)

根据此站点:http://www.dba-oracle.com/t_convert_set_to_join_sql_parameter.htm,用NOT IN子查询替换MINUS运算符的速度更快。我有兴趣看到这个证据。无论如何,我使用REGEXP_REPLACE使用它,因为我对嵌套的INSTR / SUBSTR调用过敏。

首先,我使用WITH子句设置数据Table1和Table2作为原始数据表(当然你已经有了这些,所以不需要这部分)。注意我在其中添加了一个带有嵌入式逗号的附加行,以满足OP的注释中的问题。然后,仍然使用WITH子句我从相同的数据中进行了T1_converted和T2_converted,但是从Table1 / ColumnA剥离了前3个字符,并且从Table2 / ColumnB剥离了前导3和尾随3。这样做可以减少底部实际选择中所需的REGEXP_REPLACE调用次数,并准备数据以使选择更容易理解。注 - 假设在两个表中将始终有3个前导字符和要在表2中剥离的3个尾随字符。如果这应该改变,正则表达式将不得不改变。

SQL> -- Simulates original table
SQL> with Table1(ColumnA) as (
  2    select 'TZ-ZA112' from dual
  3    union
  4    select 'TZ-RT322' from dual
  5    union
  6    select 'TZ-JKAAA' from dual
  7  ),
  8  -- Simulates original table
  9       Table2(ColumnB) as (
 10    select 'TZ-ZA112,-2' from dual
 11    union
 12    select 'TZ-HHASS,-4' from dual
 13    union
 14    select 'TZ-RT322,4-' from dual
 15    union
 16    select 'TZ-R,T322,4-' from dual  -- make sure commas are handled
 17  ),
 18  -- Strip leading 3 characters from table 1
 19       T1_converted(ColA) as (
 20    select regexp_replace(ColumnA, '^.{3}(.*)$', '\1') from Table1
 21  ),
 22  -- Strip leading and trailing 3 characters from table 2
 23       T2_converted(ColB) as (
 24    select regexp_replace(ColumnB, '^.{3}(.*).{3}$', '\1') from Table2
 25  )
 26  -- Get the differences
 27  select ColA Unique
 28  from T1_converted
 29  where (ColA) not in
 30     (select ColB from T2_converted)
 31     union all
 32  select ColB from T2_converted
 33  where (ColB) not in
 34     (select ColA from T1_converted);

输出:

Unique
-----------------------------------------------------------------------------
JKAAA
R,T322
HHASS

SQL>

我没有看到包含具有数据的表名(或缺少数据?)的值,但这不符合您的要求,所以我将把它作为练习留给您suss out