我目前正在使用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.
有人可以告诉我,我错过了什么?
答案 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';