2

我有一個帶有HSTORE列「ext」的表,其中值爲int4range。舉個例子:如何在PostgreSQL中爲具有int4range值的hstore類型創建運算符

"p1"=>"[10, 18]", "p2"=>"[24, 32]", "p3"=>"[29, 32]", "p4"=>"[18, 19]" 

然而,當我嘗試創建這個表達式指數,我得到一個錯誤:

CREATE INDEX ix_test3_p1 
ON test3 
USING gist 
(((ext -> 'p1'::text)::int4range)); 

ERROR: data type text has no default operator class for access method "gist" SQL state: 42704 Hint: You must specify an operator class for the index or define a default operator class for the data type.

如何創建此操作?

注意

每個記錄可能有自己獨特的一套鑰匙。每個鍵表示一個屬性,值表示值的範圍。所以不是所有的記錄都會有「p1」。在hstore中考慮這個EAV模型。

回答

1

我沒有得到這個錯誤 - 我得到「索引表達式函數必須註明IMMUTABLE」

CREATE TABLE ht (ext hstore); 
INSERT INTO ht VALUES ('p1=>"[10,18]"'), ('p1=>"[99,99]"'); 
CREATE INDEX ht_test_idx ON ht USING GIST (((ext->'p1'::text)::int4range)); 
ERROR: functions in index expression must be marked IMMUTABLE 

CREATE FUNCTION foo(hstore) RETURNS int4range LANGUAGE SQL AS $$ SELECT ($1->'p1')::int4range; $$ IMMUTABLE; 
CREATE INDEX ht_test_idx ON ht USING GIST (foo(ext)); 
SET enable_seq_scan=false; 
EXPLAIN SELECT * FROM ht WHERE foo(ext) = '[10,19)'; 
           QUERY PLAN        
----------------------------------------------------------------------- 
Index Scan using ht_test_idx on ht (cost=0.25..8.52 rows=1 width=32) 
    Index Cond: (foo(ext) = '[10,19)'::int4range) 

我猜投並不是一成不變的,因爲你可以改變的默認格式範圍從包容......獨家「[...)」到別的東西。你大概不會這樣做。

很明顯,你會希望你的真正功能,處理像丟失「P1」的條目,形成嚴重的數值範圍等

+0

我得到了「不可改變的」錯誤,當我嘗試添加一個B樹索引。我的查詢將在關鍵__的值[_,_]處進行。我不清楚你寫的是什麼,它將作爲鍵上的表達式索引。 – IamIC

+0

還是我需要爲每個鍵創建一個函數?這似乎沒有道理。基本上有些記錄會有'p1',其他的則不會,在hstore中考慮這個EAV模型。 – IamIC

+1

確定 - 關閉這個問題(不知道你是怎麼做的)並且發佈另一個記錄。實現,因爲它不是很清楚,我不明白數據結構有什麼用途,或者你打算如何使用它, –

相關問題