跳到主要内容
最后于 更新

JSON_EXTRACT_STRING

描述​

JSON_EXTRACT_STRING 从 JSON 对象中提取 <json_path> 指定的字段,并将其转换为 STRING 类型。

语法​

JSON_EXTRACT_STRING(<json_object>, <json_path>)

参数​

参数描述
<json_object>必需。JSON 值,或可转换为 JSON 的合法 JSON 字符串。
<json_path>必需。STRING 类型的 JSON 路径;数组遍历使用显式通配符。

返回值​

Nullable(STRING) 返回提取出的 STRING 值,某些情况会得到 NULL

使用说明​

  1. 如果 <json_object> 或则 <json_path> 为 NULL,返回 NULL。
  2. 如果 <json_path> 指定的元素不存在返回 NULL。
  3. 如果 <json_path> 指定的元素无法转换为 STRING 返回 NULL。
  4. 其行为与 "cast + json_extract" 一致,即等价于:
    CAST(JSON_EXTRACT(<json_object>, <json_path>) as STRING)
    所以即使 <json_path> 指向的对象不是 STRING 类型,但是只要支持转换为 STRING 类型也能得到转换后的值。
  5. 这里返回的 STRING 是不带有双引号的(")。
  6. 对于 JSON 对象中的 null 值,得到的不是 NULL 而是字符串 null,如果想要判断一个元素是否为 null 请使用函数 JSON_EXTRACT_ISNULL。

示例​

  1. 正常参数
    SELECT json_extract_string('{"id": 123, "name": "doris"}', '$.name');

```text
+---------------------------------------------------------------+
| json_extract_string('{"id": 123, "name": "doris"}', '$.name') |
+---------------------------------------------------------------+
| doris |
+---------------------------------------------------------------+
```
2. 路径不存在的情况
```sql
SELECT json_extract_string('{"id": 123, "name": "doris"}', '$.name2');
```
```text
+----------------------------------------------------------------+
| json_extract_string('{"id": 123, "name": "doris"}', '$.name2') |
+----------------------------------------------------------------+
| NULL |
+----------------------------------------------------------------+
```
3. NULL 参数
```sql
SELECT json_extract_string('{"id": 123, "name": "doris"}', NULl);
```
```text
+-----------------------------------------------------------+
| json_extract_string('{"id": 123, "name": "doris"}', NULl) |
+-----------------------------------------------------------+
| NULL |
+-----------------------------------------------------------+
```
```sql
SELECT json_extract_string(NULL, '$.id2');
```
```text
+------------------------------------+
| json_extract_string(NULL, '$.id2') |
+------------------------------------+
| NULL |
+------------------------------------+
```
4. 其他类型被转换为 STRING 的情况
```sql
SELECT json_extract_string('{"id": 123, "name": "doris"}','$.id');
```
```text
+------------------------------------------------------------+
| json_extract_string('{"id": 123, "name": "doris"}','$.id') |
+------------------------------------------------------------+
| 123 |
+------------------------------------------------------------+
```
5. null 值会被转换为字符串 "null" 而不是 NULL
```sql
SELECT json_extract_string('{"id": null, "name": "doris"}','$.id');
```
```text
+-------------------------------------------------------------+
| json_extract_string('{"id": null, "name": "doris"}','$.id') |
+-------------------------------------------------------------+
| null |
+-------------------------------------------------------------+
```

### 提取数组中的同名字段(Doris 4.0 及后续版本)

使用 `$[*].k1` 显式遍历数组元素;`$.k1` 只访问对象成员,不会隐式遍历数组,因此下面的直接路径返回 SQL `NULL`。没有 `k1` 的数组元素会被忽略。

返回值是包含 JSON 数组文本的 `STRING`,不是 SQL `ARRAY`。
```sql
SELECT json_extract_string('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$.k1') AS direct_path,
json_extract_string('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$[*].k1') AS all_values;
+-------------+------------------+
| direct_path | all_values |
+-------------+------------------+
| NULL | ["v1","v3","v4"] |
+-------------+------------------+