Wählen Sie etwas aus, das mehr / weniger als x Zeichen hat

109

Ich habe mich gefragt, ob es möglich ist, etwas auszuwählen, das mehr oder weniger als x Zeichen in SQL enthält.

Ich habe beispielsweise eine Mitarbeitertabelle und möchte alle Mitarbeiternamen anzeigen, deren Name mehr als 4 Zeichen enthält.

Hier ist eine Beispieltabelle

ID EmpName Dept
1  Johnny  ACC
2  Dan     IT
3  Amriel  PR
4  Amy     HR
MNX1024
quelle

Antworten:

180

Wenn Sie SQL Server verwenden, verwenden Sie die LENFunktion (Länge):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN dafür heißt es:

Gibt die Anzahl der Zeichen des angegebenen Zeichenfolgenausdrucks
ohne nachfolgende Leerzeichen zurück.

Hier ist der Link zum MSDN

Für oracle / plsql, das Sie verwenden können, verwendet Length()mysql auch Length.

Hier ist die Oracle-Dokumentation:

http://www.techonthenet.com/oracle/functions/length.php

Und hier ist die mySQL-Dokumentation von Length(string):

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length

Für PostgreSQL können Sie length(string)oder verwenden char_length(string). Hier ist die PostgreSQL-Dokumentation:

http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-SQL

JonH
quelle
1
Für zusammengesetzte Ungleichungen fügen Sie einfach eine ANDAnweisung hinzu, z. B. SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
28

JonH hat den Teil zum Schreiben der Abfrage sehr gut behandelt. Es gibt jedoch noch ein weiteres wichtiges Problem, das erwähnt werden muss, nämlich die Leistungsmerkmale einer solchen Abfrage. Wiederholen wir es hier (angepasst an Oracle):

SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;

Diese Abfrage beschränkt das Ergebnis einer Funktion, die auf einen Spaltenwert angewendet wird (das Ergebnis der Anwendung der LENGTHFunktion auf die EmployeeNameSpalte). In Oracle und wahrscheinlich in allen anderen RDBMS bedeutet dies, dass ein regulärer Index für EmployeeName für die Beantwortung dieser Abfrage unbrauchbar ist. Die Datenbank führt einen vollständigen Tabellenscan durch, was sehr kostspielig sein kann.

Verschiedene Datenbanken bieten jedoch eine Funktion für Funktionsindizes, mit der solche Abfragen beschleunigt werden sollen. In Oracle können Sie beispielsweise einen Index wie den folgenden erstellen:

CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));

Dies kann in Ihrem Fall jedoch immer noch nicht hilfreich sein, da der Index für Ihre Erkrankung möglicherweise nicht sehr selektiv ist. Damit meine ich Folgendes: Sie fragen nach Zeilen, in denen der Name länger als 4 ist. Nehmen wir an, dass 80% der Mitarbeiternamen in dieser Tabelle länger als 4 sind. Nun, dann wird die Datenbank wahrscheinlich geschlossen ( richtig), dass es sich nicht lohnt, den Index zu verwenden, da er wahrscheinlich sowieso die meisten Blöcke in der Tabelle lesen muss.

Wenn Sie jedoch die Abfrage in "ändern" ändern LENGTH(EmployeeName) <= 4oder LENGTH(EmployeeName) > 35davon ausgehen, dass nur sehr wenige Mitarbeiter Namen mit weniger als 5 oder mehr als 35 Zeichen haben, wird der Index ausgewählt und die Leistung verbessert.

Kurz gesagt: Achten Sie auf die Leistungsmerkmale von Abfragen wie der, die Sie schreiben möchten.

Luis Casillas
quelle
5

Heute habe ich dasselbe in db2 versucht und unten verwendet, in meinem Fall hatte ich Leerzeichen am Ende der varchar-Spaltendaten

SELECT EmployeeName FROM EmployeeTable WHERE LENGTH (TRIM (EmployeeName))> 4;

Vipin
quelle
0

Wenn beim Abfragen einer DB2-Datenbank dasselbe Problem auftritt, müssen Sie die folgende Abfrage verwenden.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Jelani
quelle