Expresiones Regulares Oracle 11g

时间:2017-11-23 21:56:39

标签: oracle

我有一个问题我想要比较B列中存在的A列值,无论它们在B列中的顺序如何

例如:

Column A 177                           Column B 177 
Column A 2 : 3 : 1 : 18 : 123 : 170    Column B 18 : 123 : 3 : 2 : 3 : 1 : 1
Column A 2 : 3 : 177 : 123             Column B 3 : 123 : 2 : 177
Column A 2 : 3 : 1 : 123 : 177         Column B 1 : 123 : 2 : 3 : 3 : 1
Column A 172                           Column B 1
Column A 2 : 3 : 1 : 18 : 123 : 177    Column B 3 : 1 : 18 : 123 : 3 : 2 : 1

我们可以看到第一个记录OK 第二条记录,NO,因为值170不存在 第三次注册,好的,虽然订单与A栏不一样,但有值

第四条记录,没有 第五项记录,没有 第六个寄存器号

非常感谢帮助朋友们!

我正在使用Oragle 11g。

1 个答案:

答案 0 :(得分:0)

您正在尝试在SQL中实现字符串到表格功能。

正如here所述,下面的代码段将是一个良好的开端。您可以通过将分隔符更改为:而不是,来扩展以下内容,然后包含DENSE RANK以比较组中的列值。一旦将字符串分成多行,就可以轻松比较。因此,与C1 = C2之类的直接检查不同,您可以包含DENSE RANK值来确定这一点。

我无法访问任何Oracle实例进行小提琴或测试,甚至sqlfiddle.com现在已经破坏了很长时间。但是这个指针应该以某种方式帮助你。我所包含的链接包含此功能的多种选择。

SQL> SELECT str
  2  ,      REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) AS single_element
  3  ,      LEVEL                                 AS element_no
  4  FROM  (
  5         SELECT ROWNUM AS id
  6         ,      str
  7         FROM   t
  8        )
  9  CONNECT BY INSTR(str, ',', 1, LEVEL-1) > 0
10         AND id = PRIOR id
11         AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

STR                            SINGLE_ELEMENT                 ELEMENT_NO
------------------------------ ------------------------------ ----------
X,Y,Z                          X                                       1
X,Y,Z                          Y                                       2
X,Y,Z                          Z                                       3
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX                                     1
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y                                       2
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ                                      3
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA                                   4
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B                                       5
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC                                     6
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D                                       7
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E                                       8
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F                                       9
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG                                    10