【问题标题】:Can't use an IF ... THEN ... ELSE inside my CASE statment SQL state: 42601不能在我的 CASE 语句 SQL 状态中使用 IF ... THEN ... ELSE:42601
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 这是我感到困惑的地方,我在 PL/pgSQL 的一个函数中,上面的查询结果被保存到这样的变量中。 var_insert_statement = ARRAY(...); 我猜,虽然我使用的是 PL/pgSQL,但我无法在查询中插入 PL/pgSQL 关键字。
    • @QuoVadis:你猜对了。在 SQL 语句中,只有 SQL 语法是有效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多