[英]Extract data from json inside mysql field
我有一個帶有行的表,其中一行有一個包含這樣數據的字段
{"name":"Richard","lastname":null,"city":"Olavarria","cityId":null}
我想選擇我擁有的所有不同的“城市”值。 只使用mysql服務器。
是否可以? 我正在嘗試這樣的事情
SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"]*)key_word([^"]*)"';
但我不能讓正則表達式工作
提前致謝
MySQL 在 5.7.7 版本中獲得了對 JSON 的支持http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/您將能夠使用 jsn_extract 函數來有效地解析您的 JSON 字符串。
如果您有一個舊版本並且您想純粹在 mysql 中解決它,那么恐怕您必須將它視為一個字符串並從中刪除值(只是普通的字符串函數或使用正則表達式)這並不優雅,但它將工作
http://sqlfiddle.com/#!9/97cfd/14
SELECT
DISTINCT(substring(jsonfield, locate('"city":',jsonfield)+8,
locate('","', jsonfield, locate('"city":',jsonfield))-locate('"city":',jsonfield)-8)
)
FROM
ForgeRock
我已經將它封裝到一個存儲函數中,用於限制 MySQL <5.7.7 的函數:
CREATE FUNCTION `json_extract_string`(
p_json text,
p_key text
) RETURNS varchar(40) CHARSET latin1
BEGIN
SET @pattern = CONCAT('"', p_key, '":"');
SET @start_i = LOCATE(@pattern, p_json) + CHAR_LENGTH(@pattern);
if @start_i = CHAR_LENGTH(@pattern) then
SET @end_i = 0;
else
SET @end_i = LOCATE('"', p_json, @start_i) - @start_i;
end if;
RETURN SUBSTR(p_json, @start_i, @end_i);
END
請注意,這僅適用於字符串值,但比@DmitryK 的答案更健壯,因為如果找不到鍵,並且鍵可以在 JSON 字符串中的任何位置,它會返回一個空字符串。
請參閱 MariaDB 的動態列。
另外,在此論壇中搜索 [mysql] [json]; 這個話題經常被討論。
這可能有點晚了,但接受的答案對我不起作用。 我使用 SUBSTRING_INDEX 來達到預期的結果。
SELECT
ID, SUBSTRING_INDEX(SUBSTRING_INDEX(JSON, '"mykey" : "', -1), '",', 1) MYKEY
FROM MY_TABLE;
希望這可以幫助。
是的,您絕對可以在 mysql 中使用 JSON_EXTRACT() 函數來實現它。
讓我們拿一張包含 JSON 的表(這里是表client_services
):
+-----+-----------+--------------------------------------+
| id | client_id | service_values |
+-----+-----------+------------+-------------------------+
| 100 | 1000 | { "quota": 1,"data_transfer":160000} |
| 101 | 1000 | { "quota": 2,"data_transfer":800000} |
| 102 | 1000 | { "quota": 3,"data_transfer":70000} |
| 103 | 1001 | { "quota": 1,"data_transfer":97000} |
| 104 | 1001 | { "quota": 2,"data_transfer":1760} |
| 105 | 1002 | { "quota": 2,"data_transfer":1060} |
+-----+-----------+--------------------------------------+
要選擇每個 JSON 字段,請運行以下查詢:
SELECT
id, client_id,
json_extract(service_values, '$.quota') AS quota,
json_extract(service_values, '$.data_transfer') AS data_transfer
FROM client_services;
所以輸出將是:
+-----+-----------+----------------------+
| id | client_id | quota | data_transfer|
+-----+-----------+----------------------+
| 100 | 1000 | 1 | 160000 |
| 101 | 1000 | 2 | 800000 |
| 102 | 1000 | 3 | 70000 |
| 103 | 1001 | 1 | 97000 |
| 104 | 1001 | 2 | 1760 |
| 105 | 1002 | 2 | 1060 |
+-----+-----------+----------------------+
現在,如果你想說DISTINCT quota ,然后運行這個查詢:
SELECT
distinct( JSON_EXTRACT(service_values, '$.quota')) AS quota
FROM client_services;
所以這將導致您想要的輸出:
+-------+
| quota |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.