2014-12-22 37 views
1

我更新了幾場這樣的:如何查詢「完整」JSON字段?

UPDATE designs 
SET prices = '{ "at": 507, "ch": 751, "de": 447 }' 
WHERE prices IS NULL; 

現在我想找到所有這些行:

SELECT * FROM designs 
WHERE prices = '{ "at": 507, "ch": 751, "de": 447 }'; 

但我得到這個錯誤:

ERROR: operator does not exist: json = unknown 

變化像WHERE prices LIKE '%"at": 507, "ch": 751, "de": 447%'沒有按既不工作也不工作。

字段prices是從json類型和所用PG版本是9.3

+1

鑑於您的JSON文檔的內容,'hstore'數據類型可能是這裏更好的選擇。 –

+0

@a_horse_with_no_name謝謝!去看看它。 –

回答

1

不幸的是操作者用於=字段JSON沒有定義。如果你真的要做到這一點,你唯一的選擇是投作爲TEXT,但我敢肯定你理解這種做法,例如潛在的問題,

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }'; 

然而,它只是發生在我身上一個安全的方法是:

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }'::JSON::TEXT; 

不,這是行不通的。顯然,JSON數據類型保留了原始JSON的空格,所以如果兩個字符串中的空格不同,它將不起作用。 (我認爲這是一個錯誤,但其他人可能不同意)

我的回答對於提問者正在使用的9.3是正確的,但如果您使用9.4+,Erwin Brandstetter的回答是更好的選擇。

+0

謝謝!好答案。 –

+0

這不是一個bug,它是'json'類型的一個特性(即使對大多數來說不是特別有用)。正確的解決方案是第9.4節中的「jsonb」。 –

+0

嗯。我們可以投入「JSONB」來獲取字段順序,然後將其轉換爲文本以使其具有可比性嗎? –

3

在Postgres中有jsonb9.4,它有一個等號運算符。此數據類型有效地忽略無關緊要的空格(和其他一些不起眼的細節),這樣您的查詢將工作

SELECT * 
FROM designs 
WHERE prices = '{ "at": 507, "ch": 751, "de": 447 }'; 

同樣是不可能的json,保留無關緊要的空格,使「平等」兩個json之間的值很難建立。您可以比較文本表述,但是這不可靠

使用PG 9.4一次,你也可以做一個json列此項工作,由值鑄造jsonb on the fly:

SELECT * 
FROM designs 
WHERE prices::jsonb = '{ "at": 507, "ch": 751, "de": 447 }'::jsonb; 
+1

這很瞭解!我應該將我的幾個'JSON'字段轉換爲'JSONB'。如果使用9.4的提問者,這將是正確的答案。 –