2016-08-11 4 views
2

Если я делаю: SELECT JSON_REMOVE(@I, '$.friends[*].name'); ИЛИ SELECT JSON_REMOVE(@I, '$.friends[*].friends'); на рисунке JSON, я получаю это сообщение об ошибке:JSON_REMOVE для array.array результатов в «пути выражения не могут содержать * и ** токенов» Error

ERROR 3149 (42000): In this situation, path expressions may not contain the * and ** tokens. 

JSON :

SET @I = '{ 
    "name": "Alice", 
    "friends": [ 
    { 
     "name": "Bob", 
     "friends": [ 
     { 
      "name": "Carl", 
      "friends": [] 
     }, 
     { 
      "name": "Danny", 
      "friends": [] 
     } 
     ] 
    }, 
    { 
     "name": "Edward", 
     "friends": [ 
     { 
      "name": "Frank", 
      "friends": [] 
     }, 
     { 
      "name": "Gary", 
      "friends": [] 
     } 
     ] 
    } 
    ] 
}'; 

Однако если я SELECT JSON_EXTRACT(@I, '$.friends[*].friends') возвращает результаты в порядке.

[[{"friends": [], "name": "Carl"}, {"friends": [], "name": "Danny"}], [{"name": "Frank", "friends": []}, {"name": "Gary", "friends": []}]] 

В основном я хочу, чтобы вернуть строку со всеми friends.name удалены и, возможно, даже friends.friends удалены.

ответ

0

Похоже, MySQL не поддерживает подстановочные знаки для таких функций, как json_remove, json_set и т.д.

bool Item_func_json_remove::val_json(Json_wrapper *wr) 
{ 
    //bla-bla-bla 
    if (m_path_cache.parse_and_cache_path(args, path_idx + 1, true)) 
} 

и

bool Json_path_cache::parse_and_cache_path(Item ** args, uint arg_idx, 
              bool forbid_wildcards) 

https://github.com/mysql/mysql-server/blob/5.7/sql/item_json_func.cc#L3227 https://github.com/mysql/mysql-server/blob/5.7/sql/item_json_func.cc#L2563 https://github.com/mysql/mysql-server/blob/5.7/sql/item_json_func.cc#L534