mysql中能执行,在云数据仓库ADB中不能执行,麻烦看看什么原因?
SELECT COUNT(*) AS total FROM deli_customer q LEFT JOIN sale_member m ON q.member_id = m.id AND m.tenant_id = 10001 WHERE CASE WHEN JSON_VALID(q.lc_json_extend_field) THEN q.lc_json_extend_field->'$.lc10215' = '12' ELSE NULL END AND q.logout_status = '0' AND q.delete_flag = '0' AND m.member_status = 1 AND q.tenant_id = 10001
报下面这个错
[HY000][1815] [20002, 2024022314365719216813106903453342658] : line 1:1: SubGt not supported.
在云数据仓库ADB中不能执行MySQL中的某个语句,可能有以下原因:
DATETIME
类型在ADB中对应为TIMESTAMP
类型。CONCAT
函数在ADB中对应为||
操作符。如果您遇到了这种情况,建议检查语句的语法、数据类型、函数或操作符是否与ADB兼容,并确保您具有足够的权限来执行该语句。如果问题仍然存在,请联系ADB的技术支持团队以获取更多帮助。
当在MySQL中可以正常执行的查询在云数据仓库ADB中无法执行时,可能的原因包括:
SET ADB_CONFIG
或Hint来优化查询。解决这类问题通常需要详细检查错误信息,了解ADB的特性和限制,并根据具体情况进行调整。如果问题依然无法解决,建议联系技术支持获取帮助。
辛苦将 q.lc_json_extend_field->'$.lc10215' 替换成 json_extract(q.lc_json_extend_field, '$.lc10215' )
--此回答整理自钉群“云数据仓库ADB-开发者群”
由于云数据仓库ADB对JSON函数的支持程度不同于MySQL,上述SQL在adb中执行失败是因为它不支持直接在WHERE子句中使用JSON_EXTRACT函数的结果进行条件判断。
针对您的SQL语句,可以尝试将其改写为adb兼容的形式:
SELECT COUNT(*) AS total
FROM (
SELECT q.*,
IF(JSON_VALID(q.lc_json_extend_field),
q.lc_json_extend_field.GET("$.lc10215"),
NULL) AS lc10215_value
FROM deli_customer q
WHERE q.tenant_id = 10001
AND q.logout_status = '0'
AND q.delete_flag = '0'
) q
LEFT JOIN sale_member m
ON q.member_id = m.id
AND m.tenant_id = 10001
WHERE COALESCE(q.lc10215_value, '') = '12'
AND m.member_status = 1;
这段SQL首先在子查询中提取JSON字段的值,并赋给新的列lc10215_value
,然后再在主查询中对此列进行条件判断。注意,这里使用了IF
函数和COALESCE
函数来处理NULL和空字符串的情况。请根据实际业务逻辑调整处理方式。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。