【发布时间】:2021-03-06 06:19:05
【问题描述】:
我想即时构建插入查询。在这里,我正在收集所有列名。有些列只需要加扰,有些则需要解密、加扰和加密。
我的想法是检查列名是否在提供的数组中,如果是,则检查其值是否以“pi2”开头。如果是这样,则应用必要的转换解密、翻译、加密。否则只是翻译价值。 这是我的查询:
select
case when column_name = ANY(ARRAY['a', 'pi2_b', 'pi2_c', 'd', 'e'])
then (
if (substring(column_name from 0 for 4) = 'pi2')
then 'my_function.my_encrypt(translate(my_function.my_decrypt('||column_name ||'), '''|| var_scramble_key1 ||''','''|| var_scramble_key2 ||'''))';
else 'translate('||column_name||','''|| var_scramble_key1 ||''','''|| var_scramble_key2 ||''')';
end if; )
else column_name end
from information_schema.columns
where table_schema = 'my_temp'
and table_name = 'table_a'
order by ordinal_position ASC
运行这个查询给我一个语法错误:
在“then”SQL 状态或附近:42601 字符:177。
我的问题是为什么我不能在 CASE 语句中使用 IF THEN ELSE。
我有这个解决方法:
select
case when column_name = ANY(ARRAY['a', 'pi2_b', 'pi2_c', 'd', 'e']) AND substring(column_name from 0 for 4) = 'pi2'
then 'my_function.my_encrypt(translate(my_function.my_decrypt('||column_name ||'), '''|| var_scramble_key1 ||''','''|| var_scramble_key2 ||'''))';
when column_name = ANY(ARRAY['a', 'pi2_b', 'pi2_c', 'd', 'e'])
then 'translate('||column_name||','''|| var_scramble_key1 ||''','''|| var_scramble_key2 ||''')';
else column_name end
from information_schema.columns
where table_schema = 'my_temp'
and table_name = 'table_a'
order by ordinal_position ASC
【问题讨论】:
标签: postgresql if-statement case plpgsql