Hive CASE WHEN子句内执行解密操作 过滤无效加密值方案咨询
Hive 加密字段条件解密解决方案
你可以直接将解密逻辑嵌套在CASE WHEN语句中,只有符合正则规则的加密值才会触发解密操作,避免非法值传入DECRYPT函数产生乱码。如果需要直接剔除所有非法值的行,可以在WHERE子句中增加过滤条件,无需额外分支判断。
方案1:保留所有行,非法加密值对应解密字段返回自定义提示/NULL
SELECT a.abc, a.mno, a.xyz, CASE WHEN a.xyz rlike '=' THEN xyz ELSE 'Key Incorrect' END as Result, CASE WHEN a.xyz rlike '=' THEN DECRYPT(STRING(b.decryptid), STRING(a.xyz)) ELSE NULL -- 也可以替换为自定义提示文本,比如'Illegal Encrypted Value' END AS xyz_decrypted FROM db.a a LEFT JOIN b ON a.abc = b.def LIMIT 10;
注意:CASE WHEN 为短路执行逻辑,只有满足WHEN条件的分支才会执行后续运算,非法值不会进入解密逻辑,从根源避免乱码产生。
方案2:直接过滤掉非法加密值的行,仅保留可解密的结果
如果不需要保留非法值、NULL值对应的行,可以直接在WHERE层过滤,查询性能更高:
SELECT a.abc, a.mno, a.xyz, xyz AS Result, DECRYPT(STRING(b.decryptid), STRING(a.xyz)) AS xyz_decrypted FROM db.a a LEFT JOIN b ON a.abc = b.def WHERE a.xyz IS NOT NULL AND a.xyz rlike '=' LIMIT 10;
补充说明:如果你的解密密钥
b.decryptid也可能存在空值的情况,可以在CASE WHEN中额外增加b.decryptid IS NOT NULL的判断条件,避免密钥为空导致的解密报错。
内容的提问来源于stack exchange,提问作者SweetyP
相关产品推荐
相关产品推荐

