Auswahl nach Attributen basierend auf dem SQL-Platzhalterbereich


8

Ich möchte alle Datensätze aus einer Geodatabase-Tabelle auswählen, in der die Zeichenfolge mit einem Buchstaben beginnt, also habe ich es versucht

SELECT *
FROM tbl_names
WHERE "name" LIKE '[A-Z]%'

Dies ergab keine Aufzeichnungen. Nach einiger Suche stellte ich fest, dass dies die SQL Server-Syntax ist. Ich dachte jedoch nicht, dass dies ein Problem sein würde, soweit ich alle Versionen der SQL-Unterstützung kenne %. Nachdem ich die Hilfedatei zum Erstellen eines Abfrageausdrucks durchgesehen hatte , stellte ich fest, dass die richtige Syntax lautet

SELECT *
FROM tbl_names
WHERE "name" >= 'A'

Da die Namen alle Zeichenfolgen sind, war mein erster Instinkt, es zu versuchen LIKE. Warum wird der >=Operator anstelle von verwendet LIKE? Werden Platzhalterbereiche in ArcMap nicht unterstützt?


Ich kenne diese Datenbank nicht, aber auf welcher Seite werden Ziffern sortiert? Das heißt, kommt 0nach Z(das Übliche, denke ich) oder vorher A? Einige andere DBMS unterstützen diese Art von Funktionalität nicht, daher müssen Sie Kenntnisse über etwas andere Dinge verwenden. Und was ist mit Kleinbuchstaben (oder ist alles Großbuchstaben)? Und was ist mit nicht englischen Zeichen (nicht AZ)?
Uhrwerk-Muse

Wenn Sie ein Feld in aufsteigender Reihenfolge sortieren, werden folgende Zeichenfolgen angezeigt : !z,?,0,0a,1,10,2,ant,A,Ant,z,Z. Also Sonderzeichen, Ziffern, (Groß- und Kleinschreibung beachten) Buchstaben.
Cindy Jayakumar

Antworten:


9

Platzhalter werden im Allgemeinen von ArcMap unterstützt. Hier ist ein Auszug aus der Hilfe, die Sie erhalten, wenn Sie eine Auswahl nach Attributen durchführen:


Verwenden Sie den Operator LIKE (anstelle des Operators =), um eine teilweise Zeichenfolgensuche zu erstellen. Zum Beispiel würde dieser Ausdruck Mississippi und Missouri unter den Namen der US-Bundesstaaten auswählen:

"STATE_NAME" LIKE 'Miss%'

Sie können die Operatoren größer als (>), kleiner als (<), größer als oder gleich (> =), kleiner als oder gleich (<=) und ZWISCHEN verwenden, um Zeichenfolgenwerte basierend auf der Sortierreihenfolge auszuwählen. Mit diesem Ausdruck werden beispielsweise alle Städte in einer Abdeckung mit Namen ausgewählt, die mit den Buchstaben M bis Z beginnen:

"CITY_NAME" >= 'M' Der <>Operator ungleich ( ) kann auch zum Abfragen von Zeichenfolgen verwendet werden.

Platzhalterzeichen Ein Platzhalterzeichen ist ein spezielles Symbol, das für ein oder mehrere Zeichen steht.

Für alle dateibasierten Daten bedeutet '%', dass an seiner Stelle alles akzeptabel ist: ein Zeichen, hundert Zeichen oder kein Zeichen. Wenn Sie alternativ mit einem Platzhalter suchen möchten, der ein Zeichen darstellt, verwenden Sie '_'.

Dieser Ausdruck würde beispielsweise einen beliebigen Namen auswählen, der mit den Buchstaben Cath beginnt, z. B. Cathy, Catherine und Catherine Smith:

"NAME" LIKE 'Cath%'

Aber dieser Ausdruck würde Catherine Smith und Katherine Smith finden:

"OWNER_NAME" LIKE '_atherine smith' Die Platzhalter, mit denen Sie persönliche Geodatabases abfragen, sind '*' für eine beliebige Anzahl von Zeichen und '?' für einen Charakter.

Platzhalterzeichen werden im Abfragedialog als Schaltflächen angezeigt. Sie können auf die Schaltfläche klicken, um den Platzhalter in den Ausdruck einzugeben, den Sie erstellen. Es werden nur die Platzhalterzeichen angezeigt, die für die Datenquelle des Layers oder der Tabelle, die Sie abfragen, geeignet sind.

Wenn Sie ein Platzhalterzeichen in einer Zeichenfolge mit dem Operator = verwenden, wird das Zeichen als Teil der Zeichenfolge und nicht als Platzhalter behandelt.

Verwenden Sie bei einer verknüpften Tabelle Platzhalter, die für die Seite des Joins geeignet sind, den Sie abfragen. Wenn die Abfrage nur für Felder in der Zieltabelle (der linken Tabelle) gilt, verwenden Sie die Platzhalter der Zieltabelle. Wenn die Abfrage nur für Felder in der Verknüpfungstabelle (der rechten Tabelle) gilt, verwenden Sie die Platzhalter für die Verknüpfungstabelle. Wenn die Abfrage Felder von beiden Seiten des Joins umfasst, verwenden Sie die Platzhalter '%' und '_'.

Wenn Sie beispielsweise eine Datenbankdatei (die Verknüpfungstabelle) mit einer persönlichen GDB-Feature-Class (der Zieltabelle) verknüpfen:

  1. Verwenden Sie * für Abfragen, die nur persönliche GDB-Felder betreffen.

  2. Verwenden Sie% für Abfragen, die nur DBF-Spalten betreffen.

  3. Verwenden Sie% für Abfragen mit Spalten von beiden Seiten der Tabelle.


Demnach: Ich denke, Bereiche werden nicht unterstützt, stattdessen müssen Sie> und <so verwenden, wie Sie es getan haben.


Ich verstehe, dass Platzhalter verwendet werden können, da ich die meiste Zeit Teilzeichenfolgen ausgewählt habe WHERE "name" LIKE '%substring%'. Erst als ich nach einer Zeichenfolge in einem bestimmten Format suchen musste, wie z. B. einem regulären Ausdruck in der Form [0-9][0-9][A-Z]%, wurde mir klar, dass keine Platzhalterbereiche akzeptiert werden.
Cindy Jayakumar

Danke @Torsten! Ich wusste nie, dass man mit persönlicher GDB * nicht% für Platzhalter verwendet.
Sparky

1

Ja, Sie können Platzhalter in LIKE-Anweisungen verwenden. Ich habe noch nie Bereiche über ArcMap verwendet, aber Sie verwenden aus SQL Server-Sicht die richtige Syntax.

Ein kurzes Wort der Warnung, wenn Sie den Operator '> =' verwenden möchten. Das Ergebnis hängt davon ab, welche Sortierung festgelegt ist. Dies kann die Sortierung der Daten ändern, z. B. ob zwischen Groß- und Kleinschreibung unterschieden wird oder nicht. In einigen Fällen gibt Ihre Abfrage möglicherweise nur Werte zurück, die mit Großbuchstaben beginnen, manchmal auch mit Groß- und Kleinbuchstaben.

Siehe http://sqlblog.com/blogs/louis_davidson/archive/2007/05/20/sorting-and-case-sensitive-collations.aspx .

Wenn Sie nur an dem ersten Zeichen des Feldes interessiert sind, können Sie es auch verwenden

WHERE SUBSTRING("name", 1, 1) >= 'A'

eher, als

WHERE "name" >= 'A'

Dies kann Leistungsvorteile haben, wenn nichts anderes.


Nein, es SUBSTRINGist unwahrscheinlich , dass die Methode die Leistung steigert, da dies (normalerweise) bedeutet, dass Indizes nameignoriert werden. Ja, Sie haben möglicherweise höhere Kosten für Vergleiche (bei gegebenen Zeichenlängen), aber die meisten mir bekannten Implementierungen würden sowieso zurückkehren, nachdem das erste Zeichen verglichen wurde ... Ich persönlich bezweifle, dass ein Optimierer geschrieben wurde, um zu erkennen, dass SUBSTRING(column, 1, 1)er nur den Anfang zurückgibt der Saite
Clockwork-Muse

Würde ich in der Lage sein, die Groß- und Kleinschreibung mit zu umgehen upper? Ich mache mir zwar keine Sorgen um diese Übung, aber es wäre gut, daran zu denken.
Cindy Jayakumar

Ja, du hast absolut recht. In diesem Fall ist es unwahrscheinlich, dass die Verwendung von SUBSTRING einen Leistungsvorteil bringt, und dies könnte den gegenteiligen Effekt haben.
Pecoanddeco
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.