在postgresql json字段中搜索关键字

时间:2014-03-07 13:57:29

标签: sql json postgresql postgresql-9.1

我目前正在使用postgres 9.3.3

以下是我的表格 -

 Column       |           Type           |                             Modifiers                              | Storage  | Stats target | Description 
--------------------+--------------------------+--------------------------------------------------------------------+----------+--------------+-------------
 id                 | integer                  | not null default nextval('playerbase_palyerdata_id_seq'::regclass) | plain    |              | 
 date_joined        | timestamp with time zone | not null                                                           | plain    |              | 
 belongs_to_camp_id  | integer                  | not null                                                           | plain    |              | 
 belongs_to_coach_id | integer                  | not null                                                           | plain    |              | 
 json_kvps          | character varying(2000)  | not null                                                           | extended |              | 

一个样本数据如下 -

id |      date_joined   | belongs_to_camp_id | belongs_to_coach_id | json_kvps

1  | 2014-03-07 18:10:45.824749+05:30 |                 1 |                  1 | {"alumnicode": "2003360009", "emailusername": "aaron@hotmail.com", "altemail": "", "salutation": "Mrs", "fname": "Aaron", "mname": "V", "lname": "Schwartz", "fullname": "Aaraon M Scwartz", "programmename": "MEP", "batchyearin": "2003"}

现在我要搜索整个表格,找到一个“emailusername”的用户:“aaron@hotmail.com”

如上所述 - http://www.postgresql.org/docs/current/static/functions-json.html

我尝试按如下方式编写查询 -

SELECT * FROM playerbase_playerdata WHERE json_kvps->>'emailusername' = 'aaron@hotmail.com';

我期待上面的列,而是我得到以下错误 -

ERROR:  operator does not exist: character varying ->> unknown
LINE 1: ...ELECT * FROM memberbase_memberdata WHERE json_kvps->>'emailu...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

有人可以告诉我,我错过了什么?

4 个答案:

答案 0 :(得分:1)

这样的功能仅存在于PostgreSQL 9.3版本中。 所以,不幸的是,要进行这样的查询,你需要更新你的PostgreSQL。

如果你有9.3,那么你需要使用json列类型。

在这里你可以看到一些例子。它有助于我,更早: http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/

度过愉快的一天。

答案 1 :(得分:0)

对于django模型,您可以使用JsonField。

https://pypi.python.org/pypi/jsonfield

它工作正常,但是如果你使用的PostgreSQL版本低于9.2,它将创建字符列。

答案 2 :(得分:0)

select [Required Fields] from  [Table Name] WHERE  [Column Name]::text = '{[Key]}' ::text

答案 3 :(得分:0)

对于PostgreSQL 9.3或更高版本,一种可能的解决方案可能是使用强制转换为json:

  

SELECT * FROM playerbase_playerdata WHERE json_kvps->>' emailusername' =' aaron@hotmail.com' ;;

SELECT * FROM playerbase_playerdata WHERE CAST(json_kvps AS JSON)->>'emailusername' = 'aaron@hotmail.com';