Oracle JSON_TEXTCONTAINS多条件组合查询逻辑异常求助
问题分析与解决建议
看起来你的问题出在JSON路径的转义处理错误,导致第二个过滤条件没有正确生效,进而让AND运算符失去了作用。咱们一步步拆解:
核心问题:错误的JSON路径写法
你在查询customerIdCode时用了$."customerIdCode",这里的"是HTML转义字符,但在Oracle的SQL语句中,JSON路径的双引号不需要这么转义——甚至对于customerIdCode这种没有特殊字符(空格、符号)的键名,根本不需要用双引号包裹。
这种错误的路径写法会让Oracle无法正确定位到customerIdCode这个JSON键,导致对应的JSON_TEXTCONTAINS条件始终返回TRUE(或者说没有起到过滤作用)。最终你的查询逻辑实际上变成了:(TYPE是ZHS/ABC) AND (永远为真),自然会把所有符合TYPE条件的记录都查出来,包括customerIdCode=123的那条。
解决步骤
1. 修正JSON路径写法
把$."customerIdCode"改成$.customerIdCode即可,因为这个键名是合法的标识符,不需要双引号。修正后的查询语句如下:
SELECT json_value(json_value, '$.customerIdCode'), json_value(json_value, '$.TYPE') FROM addcols_json addjson WHERE (JSON_TEXTCONTAINS(addjson.json_value, '$.TYPE', 'ZHS') OR JSON_TEXTCONTAINS(addjson.json_value, '$.TYPE', 'ABC')) AND (JSON_TEXTCONTAINS(addjson.json_value, '$.customerIdCode', '967') OR JSON_TEXTCONTAINS(addjson.json_value, '$.customerIdCode', '351'));
如果你的JSON键名确实需要用双引号(比如包含空格),在Oracle SQL中应该直接用单引号包裹路径字符串,内部双引号不需要转义,比如:'$."customer Id Code"'。
2. 更简洁的替代写法(推荐)
其实对于这种等值匹配的场景,用JSON_VALUE结合IN运算符会更直观,也更容易排查错误:
SELECT json_value(json_value, '$.customerIdCode') AS customerIdCode, json_value(json_value, '$.TYPE') AS TYPE FROM addcols_json addjson WHERE json_value(json_value, '$.TYPE') IN ('ZHS', 'ABC') AND json_value(json_value, '$.customerIdCode') IN ('967', '351');
3. 额外验证点
- 确认你的JSON列中
customerIdCode的值是字符串类型:如果是数字类型,'967'(字符串)和967(数字)不会匹配,这时候要把查询值改成数字,或者用JSON_NUMBER转换。 - 检查JSON结构是否符合预期:确保每条记录的
customerIdCode和TYPE键确实存在,没有拼写错误(比如大小写问题,Oracle的JSON路径默认是大小写敏感的)。
内容的提问来源于stack exchange,提问作者winds.liu
相关产品推荐
相关产品推荐

