2016-07-14 21 views
-1

Ich habe einen Auftrag Aufgabe, die die Namen der Mitarbeiter, deren Namen beginnen mit K, M oder S zur Liste istWIE 'X%' ODER WIE 'Y%' ODER WIE 'Z%' =/= WIE '[XYZ]%'?

Die Mitarbeiter Tabelle:

ENAME 
---------- 
KING 
BLAKE 
CLARK 
JONES 
MARTIN 
ALLEN 
TURNER 
JAMES 
WARD 
FORD 
SMITH 

ENAME 
---------- 
SCOTT 
ADAMS 
MILLER 

kommt das Problem.

Wenn ich den folgenden Befehl verwenden, es funktioniert, aber es ist ziemlich wortreich:

SQL> SELECT ename from emp where ename LIKE 'K%' OR ename LIKE 'M%' OR ename LIKE 'S%'; 

ENAME 
---------- 
KING 
MARTIN 
SMITH 
SCOTT 
MILLER 

Aber wenn ich diesen Befehl versuchen, die funktionieren sollte, es gibt mir diese:

SQL> SELECT ename from emp where ename LIKE '[KMS]%'; 

no rows selected 

Meine Verständlich ist, dass die [] einen Platzhalterbereich oder bestimmte Werte erlaubt, aber ich verstehe nicht, warum dies nicht Mitarbeiter überprüfen, deren Namen mit K, M oder S beginnen.

+0

„aber ich verstehe nicht, warum dies erlaubt nicht, Mitarbeiter zu überprüfen, deren Namen mit K, M oder S beginnen "- weil (definitionsgemäß) Mitarbeiter mit Namen ausgewählt werden, die explizit mit" KMS "beginnen –

+0

@MitchWheat Laut diesem Link https://msdn.microsoft .com/de-us/library/ms179859.aspx? f = 255 & MSPPError = -2147217396, es besagt, dass der Platzhalter [] ein einzelnes Zeichen innerhalb des angegebenen Bereichs ([af]) oder set ([abcdef]) zulässt. – yuritsuki

+1

sqlplus ist nicht TSQL –

Antwort

3

können Sie links verwenden

SELECT ename von emp WHERE (ename, 1) links in ('M', 'K', 'S')

+0

Das Problem mit dieser Art ist es wahrscheinlich wird nicht einen Index verwenden, wenn eine vorhanden war –

+0

Wie groß ist die Tabelle? –

+0

sollten Sie das nicht vom Poster verlangen? Außerdem wird das ursprüngliche "LIKE" mit Sicherheit einen besseren Abfrageplan ergeben –

2

Sie könnten versuchen mit einem regulären Ausdruck (aber ich sehe nichts falsch mit Ihrer ursprünglichen LIKE Klausel in Betrieb):

SELECT ename from emp 
WHERE REGEXP_LIKE (ename , '^[KMS]'); 

Ref :. Pattern-matching Conditions

+0

Oracle kann anders sein, aber normalerweise bedeutet dies "beginnt mit K, oder enthält M oder S" und "beginnt mit K, M oder S" kann geschrieben werden als '^ (K | M | S)' oder einfach '^[KMS] '. Hinweis: Dies ist nicht 'LIKE', daher bedeutet die Tatsache, dass' [] 'nicht mit' LIKE' funktioniert, nicht, dass es hier nicht funktioniert. – hvd

+0

Danke. Ich sah zwar komisch aus. Aktualisiert nach Ihrem Kommentar. –

Verwandte Themen