2016-03-04 5 views
5

(ursprünglich Teil this question, aber es war etwas irrelevant, so habe ich beschlossen, es eine Frage der eigenen zu machen.)Operator ~ <~ in Postgres

Ich kann nicht finden, was der Betreiber ~<~ ist. Das Postgres Handbuch erwähnt nur ~ und ähnliche Operatoren here, aber kein Zeichen von ~<~.

Wenn in der psql Konsole Hantieren, fand ich heraus, dass diese Befehle die gleichen Ergebnisse liefern:

SELECT * FROM test ORDER BY name USING ~<~; 
SELECT * FROM test ORDER BY name COLLATE "C"; 

und diese gibt die umgekehrte Reihenfolge:

SELECT * FROM test ORDER BY name USING ~>~; 
SELECT * FROM test ORDER BY name COLLATE "C" DESC; 

auch einige Informationen über die Tilde-Betreiber :

\do ~*~ 
            List of operators 
    Schema | Name | Left arg type | Right arg type | Result type |  Description  
------------+------+---------------+----------------+-------------+------------------------- 
pg_catalog | ~<=~ | character  | character  | boolean  | less than or equal 
pg_catalog | ~<=~ | text   | text   | boolean  | less than or equal 
pg_catalog | ~<~ | character  | character  | boolean  | less than 
pg_catalog | ~<~ | text   | text   | boolean  | less than 
pg_catalog | ~>=~ | character  | character  | boolean  | greater than or equal 
pg_catalog | ~>=~ | text   | text   | boolean  | greater than or equal 
pg_catalog | ~>~ | character  | character  | boolean  | greater than 
pg_catalog | ~>~ | text   | text   | boolean  | greater than 
pg_catalog | ~~ | bytea   | bytea   | boolean  | matches LIKE expression 
pg_catalog | ~~ | character  | text   | boolean  | matches LIKE expression 
pg_catalog | ~~ | name   | text   | boolean  | matches LIKE expression 
pg_catalog | ~~ | text   | text   | boolean  | matches LIKE expression 
(12 rows) 

die 3. und 4. Reihen ist der Betreiber, die ich suche, aber die DESC Für mich ist das ein bisschen ungenügend.

+0

Dieser Operator wird von Postgres für die Suche verwendet, wenn Sie einen Index mit opclass haben. http://www.postgresql.org/docs/9.5/static/indexes-opclass.html –

+0

Erstellen Sie einen Index für 'test (name text_pattern_ops)' und sehen Sie sich die 'EXPLAIN' Ausgabe für' name LIKE 'abc%' 'an –

Antwort

4

~>=~, ~<=~, ~>~ und ~<~ sind text Muster (oder varchar, im Grunde die gleichen) Operatoren, die Gegenstücke der jeweiligen Geschwistern >=, <=, > und <. Sie sortieren Zeichendaten streng nach ihren Byte-Werten und ignorieren Regeln jeder Sortiereinstellung (im Gegensatz zu ihren Geschwister). Dies macht sie schneller, aber auch für die meisten Sprachen/Länder ungültig.

Das Gebietsschema "C" ist effektiv dasselbe wie kein Gebietsschema, was bedeutet, dass keine Vergleichsregeln vorhanden sind. Das erklärt, warum ORDER BY name USING ~<~ und ORDER BY name COLLATE "C" am Ende dasselbe tun.

Ausführliche Erklärung im letzten Kapitel dieser verwandten Antwort auf dba.SE:


Beachten Sie, dass ~~ ist der Postgres Operator verwendet, um die SQL LIKE expression zu implementieren und ist kaum verwandt zu den oben genannten. In ähnlicher Weise implementiert ~~*ILIKE. Mehr:

+0

Danke für die Antwort, vor allem für den Hinweis auf die Beziehung zu COLLATE C "'. Ich habe sogar deine Antwort auf dba.SE gelesen, bevor ich meine Frage gestellt habe, aber irgendwie habe ich den Teil mit '~ <~' Operator verpasst. –