不能在我的 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
恰好在两者中都有效(但存在细微的语法差异!)
我想即时构建插入查询。在这里,我正在收集所有列名。有的栏目只需要加扰,有的栏目需要解密、加扰、加密。
我的想法是检查列名是否在提供的数组中,如果是,检查它的值是否以 '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
恰好在两者中都有效(但存在细微的语法差异!)