postgresql - 如何简化 postgres 中的嵌套函数调用和 case 语句?
问题描述
我目前将此片段作为更大查询的一部分。它可以工作,但我想简单地嵌套字符串函数和substring
CASE 语句中的重复调用。
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length(substring(pr.modifications, 'eid=([^&]+)')) IN (74,50) THEN
substring(pr.modifications, 'eid=([^&]+)') || '=='
ELSE
substring(pr.modifications, 'eid=([^&]+)')
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id;
这是一个测试用例:
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length('ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw') IN (74,50) THEN
'ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw' || '=='
ELSE
'ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw'
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id;
-- Output:
-- fbt9t2140ketgv9n6kkb8jesf8
我尝试了几种替代方法,但我得到的只是语法错误。
解决方案
尝试 CTE:
WITH mystr AS (
SELECT substring(pr.modifications, 'eid=([^&]+)') AS s
)
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length(s) IN (74,50) THEN
s || '=='
ELSE
s
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id
FROM mystr;
推荐阅读
- sql - 光标替换
- python - 虚拟环境使用 pip 版本 9 创建, pip --version 显示版本 20
- enterprise-architect - 有没有办法在 Sparx Enterprise Architect 中列出包的元素?
- swift - 加快 CI 上的 fastlane
- amazon-web-services - 具有多个用户的 AWS Sagemaker Notebook
- c - “大多数 C 系统提供逻辑上无限的浮点值”是什么意思?
- modeling - 插入符号中的混合变量多因素分析(MFA):有可能吗?我可以使用任何 FactoMineR::FAMD 输出吗?
- cobol - COBOL 的 EVALUATE:如何有一个空的 WHEN OTHER 子句?
- c++ - 新字符 [] 与新字符 ()、删除 () 与删除 []
- reactjs - React Native 中视图之间的奇怪差距