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

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

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

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版本中的对应替代解决方案。

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...