[Oracle] case insensitive Suche in 10g

MPr

Erfahrenes Mitglied
Bei Tom Kyte (wo sonst?) findet man folgende hübsche Möglichtkeit, in 10g case eine insensitive Konditionsprüfung zu ermöglichen. Relevant wäre diese Option beispielsweise dann, wenn man die Statements einer Applikation nicht ändern - und die Prüfung z.B. nicht mit einem UPPER beeinflussen - kann.

SQL:
SQL> create table t ( data varchar2(20) );

Tabelle wurde erstellt.

SQL> insert into t values ( 'Hello' );

1 Zeile wurde erstellt.

SQL> insert into t values ( 'HeLlO' );

1 Zeile wurde erstellt.

SQL> insert into t values ( 'HELLO' );

1 Zeile wurde erstellt.

-- wie zu erwarten liefert die folgende Query
-- zunächst kein Ergebnis
SQL> select * from t where data = 'hello'

Es wurden keine Zeilen ausgewählt

SQL> alter session set nls_comp=ansi;

Session wurde geändert.

SQL> alter session set nls_sort=binary_ci;

Session wurde geändert.

-- Nach Anpassung der beiden NLS-Parameter wird die
-- Bedingung case insensitive behandelt
SQL> select * from t where data = 'hello'

DATA
--------------------
Hello
HeLlO
HELLO

3 Zeilen ausgewählt.

SQL> set autot trace
SQL> r
1* select * from t where data = 'hello'

3 Zeilen ausgewählt.

Ausführungsplan
--------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
--------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 |
|* 1 | TABLE ACCESS FULL| T | 1 | 12 |
--------------------------------------------------

-- durch die Anlage eines function based index kann man den
-- Zugriff dann auch noch optimieren.
SQL> create index t_idx on
2 t( nlssort( data, 'NLS_SORT=BINARY_CI' ) );

Index wurde erstellt.

SQL> select * from t where data = 'hello';

3 Zeilen ausgewählt.

Abgelaufen: 00:00:00.03

Ausführungsplan
-----------------------------------------------------
Plan hash value: 470836197

-----------------------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------------------
| 0 | SELECT STATEMENT | | 1 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 |
|* 2 | INDEX RANGE SCAN | T_IDX | 1 |
-----------------------------------------------------

Zu prüfen wäre in einem solchen Fall nur, welche anderen Auswirkungen die Änderung der NLS-Parameter auf die Applikation noch haben könnte.

Weitere Details zum Thema unter http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:16370675423662:
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück