ich meine eigenen Vergleichsoperator auf dem Text-Datentyp erstellt, die natürliche Ordnung (‚1‘ < ‚2‘ < ‚10‘ < ‚11‘ usw.) verwendet, meine neue Operatoren #<#
, #<=#
, #>#
und #>=#
.Operatorklasse erstellen Muster für wie text_pattern_ops passenden
Jetzt lege ich sie in eine Operatorklasse in der Lage sein, einen Index auf sie, wie diese zu erstellen:
CREATE OPERATOR CLASS text_natsort_ops
FOR TYPE text USING btree AS
OPERATOR 1 #<#,
OPERATOR 2 #<=#,
OPERATOR 3 =,
OPERATOR 4 #>=#,
OPERATOR 5 #>#,
FUNCTION 1 bttext_natsort_cmp(text, text);
Allerdings, wenn ich einen Index mit meinem neuen text_natsort_ops
erstellen, das nicht in Abfragen verwendet wird einschließlich like
wie es gemacht wird, wenn die text_pattern_ops
verwendet werden.
Wie deklariere ich meine Operatorklasse, damit like
meinen Index verwenden kann?
UPDATE:
Das scheint oben zu arbeiten, so dass die Frage ist ungültig. Mein wirkliches Problem war, dass ich eine Abfrage wie verwendet:
select *
from mytable
where number like 'edi%'
order by number using #<#
limit 10
und ich hatte auch einen anderen Index text_pattern_ops verwenden, die vom Planer gewählt wurde, weil es viel schneller zu arbeiten scheint. Wegen der order by ... using
wird jedoch nur der Index, der meine neuen Ops verwendet, nützlich sein ... der andere Index gibt zu viele Ergebnisse zurück, und ich brauche die Limit-Klausel, die für den Index-Scan verfügbar ist.
Sie sollten Ihr Update als Antwort veröffentlichen, so dass dieses Q nicht als "unbeantwortet" lauert. –