簡體   English   中英

從mysql字段中的json中提取數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM