2016-03-04 45 views
5

(Originariamente parte di this question, ma era un po 'irrilevante, così ho deciso di farne una questione a sé stante.)Operatore ~ ​​<~ in Postgres

Non riesco a trovare quello che l'operatore ~<~ è. Il manuale di Postgres menziona solo ~ e operatori simili here, ma nessun segno di ~<~.

Quando giocherellare nella console psql, ho scoperto che questi comandi danno gli stessi risultati:

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

E questi dà l'ordine inverso:

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

anche alcune informazioni sugli operatori tilde :

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

il 3 ° e 4 ° fila è l'operatore che sto cercando, ma il disc la razione è un po 'insufficiente per me.

+0

Questo operatore viene utilizzata da Postgres per la ricerca se si dispone di un indice con opclass. http://www.postgresql.org/docs/9.5/static/indexes-opclass.html –

+0

Crea un indice su 'test (nome text_pattern_ops)' e guarda l'output di 'EXPLAIN' per' nome LIKE 'abc%' ' –

risposta

4

~>=~, ~<=~, ~>~ e ~<~ sono text modello (o varchar, sostanzialmente le stesse) operatori, le controparti dei rispettivi fratelli >=, <=, > e <. Ordinano i dati dei caratteri rigorosamente con i loro valori di byte, ignorando le regole di qualsiasi impostazione di confronto (al contrario dei loro fratelli). Questo li rende più veloci, ma anche non validi per la maggior parte delle lingue/paesi.

Il locale "C" è effettivamente lo stesso di senza locale, ovvero senza regole di confronto. Questo spiega perché ORDER BY name USING ~<~ e ORDER BY name COLLATE "C" finiscono per fare lo stesso.

spiegazione dettagliata nell'ultimo capitolo di questa risposta relative su dba.SE:


Nota che ~~ è l'operatore di Postgres usato per applicare i SQL LIKE expression e è a malapena relativo a quanto sopra. Allo stesso modo, ~~* implementa ILIKE. Più:

+0

Grazie per la risposta, in particolare per sottolineare la relazione con il 'COLLATE" C "'. Ho persino letto la tua risposta su dba.SE prima di porre la mia domanda, ma in qualche modo ho perso la parte con l'operatore '~ <~'. –