2016-11-08 71 views
1

如果我有一個名爲numbers的JSON列的MySQL表和該列(整數數組)中有[1, 2, 3]的記錄,那麼如何更新該記錄以刪除2(因此它變成[1, 3])?如何從MySQL的JSON數組中刪除一個數字?

+0

你想這樣做,使用查詢或使用任何腳本語言如PHP或Python – rodelarode

+0

與代碼這樣做是沒有問題的;由於該集合非常龐大,我正在尋找一個僅限於sql的解決方案。 –

回答

4

我正在尋找一個答案:

update tbl set numbers = json_remove(`numbers`, '$."4"'); 

要配備一定數量得到的行我的自我和來到這個問題,不想使用對象,我繼續搜索。但是,我發現了一個解決方案,你需要使用和json_remove組合json_search

下從表tbl和列numbers

UPDATE tbl 
SET numbers = JSON_REMOVE(
    numbers, replace(json_search(numbers, 'one', 1), '"', '') 
) 
WHERE json_search(numbers, 'one', 1) IS NOT NULL 
  1. json_search刪除值1返回,其中的路徑價值是,即。 "$[0]"
  2. replace除去"否則將與json_remove
  3. json_remove發生錯誤將從json_search結果

的Et瞧,您的值被刪除刪除路徑。

注:這是假定沒有重複的值

+0

不錯。感謝您的貢獻。 –

+3

請記住,如果存儲整數值(https://bugs.mysql.com/bug.php?id=79316),則JSON_SEARCH不會找到整數。 – Karim

+0

您可以使用JSON_UNQUOTE而不是替換https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-unquote –

3

直到有人找到更好的解決方案,我只是將其轉換爲對象:{"1": 1, "2": 2, "3": 3}。是的,這是醜陋的,並佔用更多的磁盤空間,但您可以獲得無需擔心重複的好處。

要增加號碼:

update tbl set numbers = json_insert(`numbers`, '$."4"', 4); 

要刪除號碼:

select * from tbl where json_contains_path(`numbers`, 'one', '$."4"');