百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

针对MySQL特有函数的梧桐替代解决方法

wptr33 2025-04-07 20:06 6 浏览

MySQL 8.0 特有函数清单包含了一些重要的JSON函数、正则表达式函数和地理空间函数,我们针对这些内容,梳理了基于梧桐6.0版本的替代解决方法。以方便用户在平时的国产化项目及其它工作中更加方便的对照及参考。

MySQL 8.0 特有函数清单(扩展)

JSON 函数:

  1. JSON_ARRAYAGG(): 将某列的值聚合成一个JSON数组
  2. JSON_OBJECTAGG(): 将键值对聚合成一个JSON对象
  3. JSON_PRETTY(): 格式化输出JSON字符串,使其更易读
  4. JSON_TABLE(): 将JSON数组转换为关系表
  5. JSON_MERGE_PATCH(): 将两个JSON对象合并,后者的键值覆盖前者的键值
  6. JSON_STORAGE_SIZE(): 计算JSON对象的存储大小
  7. JSON_KEYS(): 获取JSON对象中的所有键
  8. JSON_DEPTH(): 计算JSON对象的嵌套深度
  9. JSON_LENGTH(): 计算JSON对象的长度
  10. JSON_CONTAINS(): 检查一个JSON对象是否包含另一个JSON对象
  11. JSON_CONTAINS_PATH(): 检查JSON对象是否包含指定路径
  12. JSON_EXTRACT(): 从JSON对象中提取指定路径的值
  13. JSON_REMOVE(): 从JSON对象中删除指定路径的值
  14. JSON_INSERT(): 向JSON对象中插入值
  15. JSON_REPLACE(): 替换JSON对象中的指定路径的值
  16. JSON_SET(): 设置JSON对象中的指定路径的值
  17. JSON_UNQUOTE(): 去掉JSON字符串的引号
  18. JSON_VALID(): 检查字符串是否为有效的JSON

正则表达式函数:

  1. REGEXP_LIKE(): 检查字符串是否匹配正则表达式
  2. REGEXP_INSTR(): 返回正则表达式匹配的位置
  3. REGEXP_SUBSTR(): 返回匹配正则表达式的子字符串
  4. REGEXP_REPLACE(): 用正则表达式替换字符串中的匹配部分

地理空间函数:

  1. ST_DISTANCE_SPHERE(): 计算球面上两点之间的距离
  2. ST_MAKEENVELOPE(): 创建一个矩形包络
  3. ST_MAKEPOINT(): 创建一个点
  4. ST_TRANSFORM(): 变换几何对象的坐标系
  5. ST_GEOMFROMGEOJSON(): 从GeoJSON创建几何对象
  6. ST_ASGEOJSON(): 将几何对象转换为GeoJSON
  7. ST_ISVALID(): 检查几何对象是否有效
  8. ST_ASTEXT(): 将几何对象转换为文本
  9. ST_SRID(): 返回几何对象的空间参考系统标识符
  10. ST_SETSRID(): 设置几何对象的空间参考系统标识符
  11. ST_DISTANCE(): 计算两几何对象之间的距离
  12. ST_INTERSECTS(): 检查两几何对象是否相交

详细说明及替代方案

JSON 函数:

  1. JSON_ARRAYAGG(): 将某列的值聚合成一个JSON数组
  2. MySQL 8.0:
  3. -- 将某列的值聚合成一个JSON数组
    SELECT JSON_ARRAYAGG(column) AS json_array FROM table_name;
  4. 梧桐 6.0 替代方案:
  5. -- 将某列的值聚合成一个JSON数组
    SELECT json_agg(column) AS json_array FROM table_name;
  6. JSON_OBJECTAGG(): 将键值对聚合成一个JSON对象
  7. MySQL 8.0:
  8. -- 将键值对聚合成一个JSON对象
    SELECT JSON_OBJECTAGG(key, value) AS json_object FROM table_name;
  9. 梧桐 6.0 替代方案:
  10. -- 将键值对聚合成一个JSON对象
    SELECT jsonb_object_agg(key, value) AS json_object FROM table_name;
  11. JSON_PRETTY(): 格式化输出JSON字符串,使其更易读
  12. MySQL 8.0:
  13. -- 格式化输出JSON字符串
    SELECT JSON_PRETTY('{"key": "value"}');
  14. 梧桐 6.0 替代方案:
  15. -- 格式化输出JSON字符串
    SELECT jsonb_pretty('{"key": "value"}'::jsonb);
  16. JSON_TABLE(): 将JSON数组转换为关系表
  17. MySQL 8.0:
  18. -- 将JSON数组转换为关系表
    SELECT * FROM JSON_TABLE(
    '[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]',
    "$[*]" COLUMNS (
    id INT PATH
    "$.id",
    name VARCHAR
    (50) PATH "$.name"
    )
    ) AS jt;
  19. 梧桐 6.0 替代方案:
  20. -- 将JSON数组转换为关系表
    SELECT * FROM json_to_recordset(
    '[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]'
    ) AS jt(id INT, name VARCHAR);
  21. JSON_MERGE_PATCH(): 将两个JSON对象合并,后者的键值覆盖前者的键值
  22. MySQL 8.0:
  23. -- 将两个JSON对象合并,后者的键值覆盖前者的键值
    SELECT JSON_MERGE_PATCH('{"a": 1, "b": 2}', '{"b": 3, "c": 4}');
  24. 梧桐 6.0 替代方案:
  25. -- 将两个JSON对象合并,后者的键值覆盖前者的键值
    SELECT '{"a": 1, "b": 2}'::jsonb || '{"b": 3, "c": 4}'::jsonb;
  26. JSON_STORAGE_SIZE(): 计算JSON对象的存储大小
  27. MySQL 8.0:
  28. -- 计算JSON对象的存储大小
    SELECT JSON_STORAGE_SIZE('{"a": 1, "b": 2}');
  29. 梧桐 6.0 替代方案:
  30. -- 计算JSON对象的存储大小
    SELECT pg_column_size('{"a": 1, "b": 2}'::jsonb);
  31. JSON_KEYS(): 获取JSON对象中的所有键
  32. MySQL 8.0:
  33. -- 获取JSON对象中的所有键
    SELECT JSON_KEYS('{"a": 1, "b": 2}');
  34. 梧桐 6.0 替代方案:
  35. -- 获取JSON对象中的所有键
    SELECT jsonb_object_keys('{"a": 1, "b": 2}'::jsonb);
  36. JSON_DEPTH(): 计算JSON对象的嵌套深度
  37. MySQL 8.0:
  38. -- 计算JSON对象的嵌套深度
    SELECT JSON_DEPTH('{"a": {"b": {"c": 1}}}');
  39. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,需要通过递归查询实现。
  40. -- 计算JSON对象的嵌套深度
    WITH RECURSIVE json_tree AS (
    SELECT
    jsonb_typeof('{"a": {"b": {"c": 1}}}'::jsonb) AS type,
    1 AS depth,
    '{"a": {"b": {"c": 1}}}'::jsonb AS js
    UNION ALL
    SELECT
    jsonb_typeof(value) AS type,
    depth + 1 AS depth,
    value
    FROM json_tree, jsonb_each(js)
    WHERE jsonb_typeof(js) = 'object'
    )
    SELECT MAX(depth) FROM json_tree;
  41. JSON_LENGTH(): 计算JSON对象的长度
  42. MySQL 8.0:
  43. -- 计算JSON对象的长度
    SELECT JSON_LENGTH('{"a": 1, "b": 2}');
  44. 梧桐 6.0 替代方案:
  45. -- 计算JSON对象的长度
    SELECT jsonb_array_length('{"a": 1, "b": 2}'::jsonb);
  46. JSON_CONTAINS(): 检查一个JSON对象是否包含另一个JSON对象
  47. MySQL 8.0:
  48. -- 检查一个JSON对象是否包含另一个JSON对象
    SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '{"a": 1}');
  49. 梧桐 6.0 替代方案:
  50. -- 检查一个JSON对象是否包含另一个JSON对象
    SELECT '{"a": 1, "b": 2}'::jsonb @> '{"a": 1}'::jsonb;
  51. JSON_CONTAINS_PATH(): 检查JSON对象是否包含指定路径
  52. MySQL 8.0:
  53. -- 检查JSON对象是否包含指定路径
    SELECT JSON_CONTAINS_PATH('{"a": 1, "b": 2}', 'one', '$.a');
  54. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 jsonb_path_exists 实现类似功能。
  55. -- 检查JSON对象是否包含指定路径
    SELECT jsonb_path_exists('{"a": 1, "b": 2}'::jsonb, '$.a');
  56. JSON_EXTRACT(): 从JSON对象中提取指定路径的值
  57. MySQL 8.0:
  58. -- 从JSON对象中提取指定路径的值
    SELECT JSON_EXTRACT('{"a": 1, "b": 2}', '$.a');
  59. 梧桐 6.0 替代方案:
  60. -- 从JSON对象中提取指定路径的值
    SELECT '{"a": 1, "b": 2}'::jsonb -> 'a';
  61. JSON_REMOVE(): 从JSON对象中删除指定路径的值
  62. MySQL 8.0:
  63. -- 从JSON对象中删除指定路径的值
    SELECT JSON_REMOVE('{"a": 1, "b": 2}', '$.a');
  64. 梧桐 6.0 替代方案:
  65. -- 从JSON对象中删除指定路径的值
    SELECT '{"a": 1, "b": 2}'::jsonb - 'a';
  66. JSON_INSERT(): 向JSON对象中插入值
  67. MySQL 8.0:
  68. -- 向JSON对象中插入值
    SELECT JSON_INSERT('{"a": 1}', '$.b', 2);
  69. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 jsonb_set 实现类似功能。
  70. -- 向JSON对象中插入值
    SELECT jsonb_set('{"a": 1}'::jsonb, '{b}', '2'::jsonb);
  71. JSON_REPLACE(): 替换JSON对象中的指定路径的值
  72. MySQL 8.0:
  73. -- 替换JSON对象中的指定路径的值
    SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.a', 3);
  74. 梧桐 6.0 替代方案:
  75. -- 替换JSON对象中的指定路径的值
    SELECT jsonb_set('{"a": 1, "b": 2}'::jsonb, '{a}', '3'::jsonb);
  76. JSON_SET(): 设置JSON对象中的指定路径的值
  77. MySQL 8.0:
  78. -- 设置JSON对象中的指定路径的值
    SELECT JSON_SET('{"a": 1, "b": 2}', '$.a', 3);
  79. 梧桐 6.0 替代方案:
  80. -- 设置JSON对象中的指定路径的值
    SELECT jsonb_set('{"a": 1, "b": 2}'::jsonb, '{a}', '3'::jsonb);
  81. JSON_UNQUOTE(): 去掉JSON字符串的引号
  82. MySQL 8.0:
  83. -- 去掉JSON字符串的引号
    SELECT JSON_UNQUOTE('"hello"');
  84. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以使用 text 类型的转换来实现类似功能。
  85. -- 去掉JSON字符串的引号
    SELECT 'hello'::text;
  86. JSON_VALID(): 检查字符串是否为有效的JSON
  87. MySQL 8.0:
  88. -- 检查字符串是否为有效的JSON
    SELECT JSON_VALID('{"a": 1}');
  89. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 TRY_CAST 进行 JSONB 类型转换判断。
  90. -- 检查字符串是否为有效的JSON
    SELECT CASE WHEN TRY_CAST('{"a": 1}' AS JSONB) IS NOT NULL THEN TRUE ELSE FALSE END;

正则表达式函数:

  1. REGEXP_LIKE(): 检查字符串是否匹配正则表达式
  2. MySQL 8.0:
  3. -- 检查字符串是否匹配正则表达式
    SELECT column FROM table_name WHERE REGEXP_LIKE(column, 'pattern');
  4. 梧桐 6.0 替代方案:
  5. -- 检查字符串是否匹配正则表达式
    SELECT column FROM table_name WHERE column ~ 'pattern';
  6. REGEXP_INSTR(): 返回正则表达式匹配的位置
  7. MySQL 8.0:
  8. -- 返回正则表达式匹配的位置
    SELECT REGEXP_INSTR(column, 'pattern') AS position FROM table_name;
  9. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以使用 POSITIONREGEXP_MATCHES 结合实现。
  10. -- 返回正则表达式匹配的位置
    SELECT POSITION((REGEXP_MATCHES(column, 'pattern'))[1] IN column) AS position FROM table_name;
  11. REGEXP_SUBSTR(): 返回匹配正则表达式的子字符串
  12. MySQL 8.0:
  13. -- 返回匹配正则表达式的子字符串
    SELECT REGEXP_SUBSTR(column, 'pattern') AS substring FROM table_name;
  14. 梧桐 6.0 替代方案:
  15. -- 返回匹配正则表达式的子字符串
    SELECT (REGEXP_MATCHES(column, 'pattern'))[1] AS substring FROM table_name;
  16. REGEXP_REPLACE(): 用正则表达式替换字符串中的匹配部分
  17. MySQL 8.0:
  18. -- 用正则表达式替换字符串中的匹配部分
    SELECT REGEXP_REPLACE(column, 'pattern', 'replacement') AS replaced_column FROM table_name;
  19. 梧桐 6.0 替代方案:
  20. -- 用正则表达式替换字符串中的匹配部分
    SELECT REGEXP_REPLACE(column, 'pattern', 'replacement') AS replaced_column FROM table_name;

地理空间函数:

  1. ST_DISTANCE_SPHERE(): 计算球面上两点之间的距离
  2. MySQL 8.0:
  3. -- 计算球面上两点之间的距离
    SELECT ST_DISTANCE_SPHERE(POINT(-71.060316, 48.432044), POINT(-71.055017, 48.431664));
  4. 梧桐 6.0 替代方案:
  5. -- 计算球面上两点之间的距离
    SELECT ST_Distance_Sphere(ST_MakePoint(-71.060316, 48.432044), ST_MakePoint(-71.055017, 48.431664));
  6. ST_MAKEENVELOPE(): 创建一个矩形包络
  7. MySQL 8.0:
  8. -- 创建一个矩形包络
    SELECT ST_MAKEENVELOPE(-71.060316, 48.432044, -71.055017, 48.431664);
  9. 梧桐 6.0 替代方案:
  10. -- 创建一个矩形包络
    SELECT ST_MakeEnvelope(-71.060316, 48.432044, -71.055017, 48.431664);
  11. ST_MAKEPOINT(): 创建一个点
  12. MySQL 8.0:
  13. -- 创建一个点
    SELECT ST_MAKEPOINT(-71.060316, 48.432044);
  14. 梧桐 6.0 替代方案:
  15. -- 创建一个点
    SELECT ST_MakePoint(-71.060316, 48.432044);
  16. ST_TRANSFORM(): 变换几何对象的坐标系
  17. MySQL 8.0:
  18. -- 变换几何对象的坐标系
    SELECT ST_TRANSFORM(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  19. 梧桐 6.0 替代方案:
  20. -- 变换几何对象的坐标系
    SELECT ST_Transform(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  21. ST_GEOMFROMGEOJSON(): 从GeoJSON创建几何对象
  22. MySQL 8.0:
  23. -- 从GeoJSON创建几何对象
    SELECT ST_GEOMFROMGEOJSON('{"type": "Point", "coordinates": [48.432044, -71.060316]}');
  24. 梧桐 6.0 替代方案:
  25. -- 从GeoJSON创建几何对象
    SELECT ST_GeomFromGeoJSON('{"type": "Point", "coordinates": [48.432044, -71.060316]}');
  26. ST_ASGEOJSON(): 将几何对象转换为GeoJSON
  27. MySQL 8.0:
  28. -- 将几何对象转换为GeoJSON
    SELECT ST_ASGEOJSON(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  29. 梧桐 6.0 替代方案:
  30. -- 将几何对象转换为GeoJSON
    SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  31. ST_ISVALID(): 检查几何对象是否有效
  32. MySQL 8.0:
  33. -- 检查几何对象是否有效
    SELECT ST_ISVALID(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  34. 梧桐 6.0 替代方案:
  35. -- 检查几何对象是否有效
    SELECT ST_IsValid(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  36. ST_ASTEXT(): 将几何对象转换为文本
  37. MySQL 8.0:
  38. -- 将几何对象转换为文本
    SELECT ST_ASTEXT(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  39. 梧桐 6.0 替代方案:
  40. -- 将几何对象转换为文本
    SELECT ST_AsText(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  41. ST_SRID(): 返回几何对象的空间参考系统标识符
  42. MySQL 8.0:
  43. -- 返回几何对象的空间参考系统标识符
    SELECT ST_SRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));
  44. 梧桐 6.0 替代方案:
  45. -- 返回几何对象的空间参考系统标识符
    SELECT ST_SRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));
  46. ST_SETSRID(): 设置几何对象的空间参考系统标识符
  47. MySQL 8.0:
  48. -- 设置几何对象的空间参考系统标识符
    SELECT ST_SETSRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  49. 梧桐 6.0 替代方案:
  50. -- 设置几何对象的空间参考系统标识符
    SELECT ST_SetSRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  51. ST_DISTANCE(): 计算两几何对象之间的距离
  52. MySQL 8.0:
  53. -- 计算两几何对象之间的距离
    SELECT ST_DISTANCE(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POINT(-71.055017 48.431664)'));
  54. 梧桐 6.0 替代方案:
  55. -- 计算两几何对象之间的距离
    SELECT ST_Distance(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POINT(-71.055017 48.431664)'));
  56. ST_INTERSECTS(): 检查两几何对象是否相交
  57. MySQL 8.0:
  58. -- 检查两几何对象是否相交
    SELECT ST_INTERSECTS(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 0))'));
  59. 梧桐 6.0 替代方案:
  60. -- 检查两几何对象是否相交
    SELECT ST_Intersects(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 0))'));

以上内容涵盖了MySQL 8.0中大部份特有的JSON函数、正则表达式函数和地理空间函数,同时提供了梧桐 6.0版本中的对应替代解决方案。

相关推荐

Linux高性能服务器设计

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

独立游戏开发者常犯的十大错误

...

学C了一头雾水该咋办?

学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...

C语言实战小游戏:井字棋(三子棋)大战!文内含有源码

井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...

C++语言到底是不是C语言的超集之一

C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...

在C++中,如何避免出现Bug?

C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...

ESL-通过事件控制FreeSWITCH

通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...

物理老师教你学C++语言(中篇)

一、条件语句与实验判断...

C语言入门指南

当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...

C++选择结构,让程序自动进行决策

什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

C++程序员学习Zig指南(中篇)

1.复合数据类型结构体与方法的对比C++类:...

研一自学C++啃得动吗?

研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...

C++关键字介绍

下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...