如何使用SET运算符从oracle集合中查找重复项,无论区分大小写

问题描述 投票:0回答:1

我知道使用SET运算符我们可以忽略或找到pl sql集合中的重复值。据我所知,SET运算符只能找到具有相同大小写的重复项(所有值都在较低的pr大写字母中)。如果有人能解释如何找到重复项,无论区分大小写,那将是很棒的。

非常感谢您的帮助。

oracle plsql
1个回答
0
投票

这就是你现在拥有的:

SQL> declare
  2    type lt is table of varchar2(10);
  3    l_col lt := lt ('A', 'A', 'B', 'a', 'b');
  4    l_set lt;
  5  begin
  6    dbms_output.put_line('Original -----');
  7    for i in l_col.first .. l_col.last loop
  8      dbms_output.put_line(l_col(i));
  9    end loop;
 10
 11    dbms_output.put_line('Set ----------');
 12    l_set := set(l_col);
 13    for i in l_set.first .. l_set.last loop
 14      dbms_output.put_line(l_set(i));
 15    end loop;
 16  end;
 17  /
Original -----
A
A
B
a
b
Set ----------
A       --> this "A" is "duplicate" of ...
B
a       --> ... this "a"
b

PL/SQL procedure successfully completed.

SQL>

一个选项(摆脱那些重复)是切换到不区分大小写的搜索选项:

SQL> alter session set nls_comp = linguistic;

Session altered.

SQL> alter session set nls_sort = binary_ai;

Session altered.

现在,运行相同的PL / SQL代码,结果是:

SQL> declare
  2    type lt is table of varchar2(10);
  3    l_col lt := lt ('A', 'A', 'B', 'a', 'b');
  4    l_set lt;
  5  begin
  6    dbms_output.put_line('Original -----');
  7    for i in l_col.first .. l_col.last loop
  8      dbms_output.put_line(l_col(i));
  9    end loop;
 10
 11    dbms_output.put_line('Set ----------');
 12    l_set := set(l_col);
 13    for i in l_set.first .. l_set.last loop
 14      dbms_output.put_line(l_set(i));
 15    end loop;
 16  end;
 17  /
Original -----
A
A
B
a
b
Set ----------
A               --> no more duplicates
B

PL/SQL procedure successfully completed.

SQL>

[编辑]

关于你无法在存储过程(包,无论如何)中改变会话的评论,你可以使用动态SQL做到这一点。这是一个演示(注释第6和第7行):

SQL> declare
  2    type lt is table of varchar2(10);
  3    l_col lt := lt ('A', 'A', 'B', 'a', 'b');
  4    l_set lt;
  5  begin
  6    execute immediate 'alter session set nls_comp = linguistic';
  7    execute immediate 'alter session set nls_sort = binary_ai';
  8
  9    dbms_output.put_line('Original -----');
 10    for i in l_col.first .. l_col.last loop
 11      dbms_output.put_line(l_col(i));
 12    end loop;
 13
 14    dbms_output.put_line('Set ----------');
 15    l_set := set(l_col);
 16    for i in l_set.first .. l_set.last loop
 17      dbms_output.put_line(l_set(i));
 18    end loop;
 19  end;
 20  /
Original -----
A
A
B
a
b
Set ----------
A
B

PL/SQL procedure successfully completed.

SQL>

如果您不想这样做,我想您必须将集合内容“导出”到表中(甚至可能是全局/私有临时表,具体取决于您使用的数据库版本),消除重复项并填充仅具有不同值的集合。

© www.soinside.com 2019 - 2024. All rights reserved.