Postgresql
如何在 postgres 中的整數 json 屬性上創建索引
我一生都無法弄清楚如何在我的 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)
表定義非常簡單。它只是
user
type的一列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 對象表示法$$ -> $$, 在索引中以及在查詢中引用欄位時,否則將不使用索引。 或者,您可以始終使用對象表示法
$$ -> $$. 你只需要堅持一個或另一個,不要混合它們。