Frage

Ich brauche die Möglichkeit für Benutzer meiner Software hinzufügen Datensätze von Zeichenbereiche auszuwählen.
Wie kann ich schreibe eine Abfrage, die alle Widgets aus einer Tabelle, dessen Namen kehrt in dem Bereich Ba-Bi zum Beispiel?

Zur Zeit verwende ich größer und kleiner als Operatoren, so würde das obige Beispiel werden:

select * from widget
where name >= 'ba' and name < 'bj'

Beachten Sie, wie ich von i nach j „erhöht“ das letzte Zeichen der oberen Grenze haben, so dass „Fahrrad“ out nicht würde verlassen.

Gibt es eine generische Art und Weise das nächste Zeichen nach einem bestimmten Zeichen auf das Feld der Sortierungs Basis zu finden, oder wäre es sicherer, eine zweite Bedingung zu erstellen?

select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')

Meine Anwendung muss die Lokalisierung unterstützen. Wie empfindlich ist diese Art der Abfrage zu verschiedenen Zeichensätzen?

Ich brauche auch sowohl MSSQL und Oracle zu unterstützen. Was sind meine Optionen für das Zeichen Gehäuse sichergestellt wird, unabhängig davon, ignoriert, welche Sprache in den Daten angezeigt wird?

War es hilfreich?

Lösung

Lassen Sie uns direkt an die Lokalisierung überspringen. Würden Sie "aa" sagen> = "ba"? Wahrscheinlich nicht, aber das ist, wo es in Schweden sortiert. Sie können aber auch einfach nicht davon ausgehen, dass Sie Gehäuse in jeder Sprache ignorieren können. Gehäuse ist ausdrücklich sprachabhängig, wobei das häufigste Beispiel dafür ist Türkisch: Groß i i ist. Klein I i ist.

Nun, SQL-DB definiert das Ergebnis von <== usw. durch eine „Sortierreihenfolge“. Dies ist definitiv sprachspezifisch. Also, sollten Sie dies explizit steuern, für jede Abfrage. Eine türkische Sortierreihenfolge wird dieses Ich gebracht, wo sie (in Türkisch) gehören. Sie können nicht auf die Standardsortierung verlassen.

Wie für die „Schrittweite Teil“, kümmern sich nicht darum. Halten Sie sich an> = und <=.

Andere Tipps

Für MSSQL finden Sie in diesem Thread: http://bytes.com/forum/thread483570.html.

Für Oracle, hängt es von der Oracle-Version, wie Oracle 10 jetzt regex (p) wie Abfragen unterstützt: http://www.psoug.org/reference/regexp.html (für REGEXP_LIKE suchen) und in diesem Artikel: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

Frustrierend ist die Oracle String Funktion SUBSTR (), während es SQL-Server ist es SUBSTRING ().

Sie können einen einfachen Wrapper um einen oder beide schreiben, so dass sie die gleiche Funktion Name + Prototyp teilen.

Dann können Sie einfach verwenden

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'

oder ähnliches.

Sie könnten so ...

select * from widget
where name Like 'b[a-i]%'

Dies wird jede Zeile passen, wo der Name mit B beginnt, ist das zweite Zeichen im Bereich von a bis i und alle andere Zeichen folgen.

ich denke, dass ich einfach mit etwas gehen würde einen hohen Sortierungs Zeichenfolge an das Ende der oberen Grenze wie anhängt. So etwas wie:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'

Ich bin nicht sicher, dass EBCDIC Umwandlung überleben würde, obwohl

Sie können auch tun es wie folgt aus:

select * from widget
where left(name, 2) between 'ba' and 'bi'

Wenn Sie Ihre Kriterien Längenänderungen (wie Sie in einem Kommentar, den Sie links, um anzuzeigen schienen), die Abfrage müssen die Länge als einen Eingang haben auch:

declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top