Postgresql

如何在 postgres 中的整數 json 屬性上創建索引

  • September 20, 2019

我一生都無法弄清楚如何在我的 json 列的屬性上創建索引,該屬性是一個整數。

我這樣試過(還有其他幾十個)

CREATE INDEX user_reputation_idx ON users(("user"->>'reputation')::int)

它在查詢中工作得很好(例如ORDER BY ("user"->>'reputation')::int

我錯過了什麼?

更新

我收到一個簡單的語法錯誤,但是,我真的不知道為什麼。

ERROR:  syntax error at or near "::"
LINE 1: ... user_reputation_idx ON users (("user"->>'reputation')::int)

表定義非常簡單。它只是usertype的一列json

所以,看起來像這樣:

CREATE TABLE users
(
 "user" json
)

試試這個:

CREATE INDEX user_reputation_idx ON users(cast("user"->>'reputation' AS int));

如果沒有索引定義中的附加括號,則不允許使用Postgres 語法快捷方式::進行轉換(請參閱@bma 的評論)。但它適用於標準 SQL 函式:這與類型本身**cast(expression AS type)**無關。json

無論哪種方式,您仍然可以expression::type在使用索引的表達式中使用語法快捷方式。

正如@bma 在評論中解釋的那樣,如果您在整個 JSON 定義周圍添加雙括號,您的索引將按原樣工作:

CREATE INDEX user_reputation_idx ON users((("user"->>'reputation')::int));

確保始終使用 JSON 文本表示法

$$ ->> $$,而不是 JSON 對象表示法$$ -> $$, 在索引中以及在查詢中引用欄位時,否則將不使用索引。 或者,您可以始終使用對象表示法

$$ -> $$. 你只需要堅持一個或另一個,不要混合它們。

引用自:https://dba.stackexchange.com/questions/54539