2016-03-04 13 views
5

(oryginalnie częścią this question, ale było nieco znaczenia, więc postanowiłem zrobić to pytanie własnych.)Operator ~ <~ w PostgreSQL

nie mogę znaleźć co operator ~<~ jest. Podręcznik Postgres wymienia tylko ~ i podobnych operatorów here, ale nie ma znaku ~<~.

Kiedy błahy w konsoli psql, okazało się, że polecenia te dają takie same wyniki:

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

a te daje odwrotny Kolejność:

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

również kilka informacji na tyldy operatorów :

\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) 

Trzeci i czwarty wiersz to operator, którego szukam, ale opis ription jest dla mnie trochę niewystarczający.

+0

Operator ten jest używany przez PostgreSQL dla odnośnika jeśli masz indeks z opclass. http://www.postgresql.org/docs/9.5/static/indexes-opclass.html –

+0

Utwórz indeks na 'test (name text_pattern_ops)' i spójrz na wyjście 'EXPLAIN' dla' name LIKE 'abc%' ' –

Odpowiedz

4

~>=~, ~<=~, ~>~ i ~<~text wzorca (lub varchar zasadniczo takie samo) operatorów, odpowiedniki ich rodzeństwa >=, <=, > i <. Sortują dane znakowe ściśle według ich wartości bajtowych, ignorując reguły dowolnego ustawienia sortowania (w przeciwieństwie do ich rodzeństwa). To sprawia, że ​​są szybsze, ale również nieważne w większości języków/krajów.

Ustawienia regionalne "C" są identyczne z bez ustawień regionalnych, co oznacza brak reguł sortowania. To wyjaśnia, dlaczego ORDER BY name USING ~<~ i ORDER BY name COLLATE "C" kończą robić to samo.

Szczegółowe wyjaśnienie w ostatnim rozdziale tej związanej z odpowiedzią na dba.SE:


Zauważ, że ~~ jest operator Postgres wykorzystywane do realizacji SQL LIKE expression i jest ledwo powiązany z powyższym. Podobnie, ~~* implementuje ILIKE. Więcej:

+0

Dziękuję za odpowiedź, szczególnie za wskazanie relacji do 'COLLATE" C "'. Nawet przeczytałem twoją odpowiedź na dba.SE przed zadaniem mojego pytania, ale jakoś przeoczyłem część z operatorem '~ <~'. –

Powiązane problemy