不能在我的 CASE 语句中使用 IF ... THEN ... ELSE SQL state: 42601

Can't use an IF ... THEN ... ELSE inside my CASE statment SQL state: 42601

我想即时构建插入查询。在这里,我正在收集所有列名。有的栏目只需要加扰,有的栏目需要解密、加扰、加密。

我的想法是检查列名是否在提供的数组中,如果是,检查它的值是否以 '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

运行 这个查询给我一个语法错误:

at or near 'then' SQL state: 42601 Character: 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

因为IF不是SQL关键词。
关键字 IF 在 PL/pgSQL 中有效,但在 中 和 SQL 语句中无效。
CASE 恰好在两者中都有效(但存在细微的语法差异!)