Mostly Anything

IT Blog über VMWare, SQL, Storage, Security und mehr.

Mostly Anything header image 2

Oracle SQL Queries case insensitive

Januar 14th, 2009 · Keine Kommentare

Bei einem Projekt wird neu Oracle 11g als Datenbank verwendet. Bisher kam ausschliesslich Microsoft SQL Server (2000 & 2005) zum Einsatz. Dabei gibt es natürlich ein paar Punkte, die anders sind und für Verwirrung sorgen. Ein Punkt ist, dass die Standard MS SQL Server Collation caseinsensitive, d.h. Gross- und Kleinschreibweise ist dasselbe, ist. Bei der Standard Oracle Installation ist das natürlich anders.

Bisher gab es mehrere Ansätze.

1. UPPER verwenden
Es wird bei der WHERE Klausel ein UPPER() verwendet. Das wurde früher oft gemacht und funktioniert auch bei (allen) älteren Versionen.

SELECT
*
FROM
SCOTT.EMP
WHERE UPPER(ENAME) = UPPER(&1);

Das Problem hierbei ist aber, dass ein normaler Index nicht verwendet wird. Seit 8i gibt es aber einen sogenannten „function-based index“. Damit diese verwendet werden können muss folgendes erfüllt sein:

  • Das System Privileg „query rewrite“ auf dem eigenen Schema
  • Das System Privileg „global query“ auf Tabellen in anderen Schemas
  • Damit der Optimizer function based indexes erkennt mü¨ssen folgende Session oder System Variablen gesetzt sein:
    QUERY_REWRITE_ENABLED=TRUE
    QUERY_REWRITE_INTEGRITY=TRUSTED
  • Der Cost Based Optimizer muss verwendet werden

Der Index wird dann folgendermassen erstellt:

CREATE INDEX UPPER_ENAME_IX on ENAME ( UPPER(ENAME) ) ;

Dieser Index wird dann aber nur für CASE INSENSITIVE Suchen verwendet, nicht für CASE SENSITIVE. Dazu müssten noch ein Index erstellt werden.

2. REGEXP_LIKE

Seit Version 10g gibt es regular expressions mit denen das Problem auch gelöst werden kanne.

SELECT *

FROM EMP

WHERE REGEXP_LIKE(ename,’James‘,’i‘);

3. NLS_SORT & NLS_COMP

ALTER SESSION SET NLS_COMP=ANSI;

ALTER SESSION SET NLS_SORT=BINARY_CI;

SELECT ENAME FROM EMP WHERE ENAME = ‚James‘;

Diese hat den Vorteil, dass existierende Indices verwendet werden und keine zusätliche Entwicklung notwendig wird.

ABER, …..

Dies funktioniert nicht mit LIKE. Bei LIKE kann ab 10gR2

NLS_COMP=LINGUISTIC;

verwendet werden. Dann klappts auch mit dem LIKE.

Be Sociable, Share!

Tags: Datenbanken · Oracle · Uncategorized

0 Antworten bis jetzt ↓

  • Es gibt keine Kommentare bis jetzt...Trete Sachen weg, die vom Formular runterfallen.

Hinterlasse ein Kommentar