为什么将 if 子句添加到查询会导致 if 错误?



PostgreSQL server, script.

问题来自 if-then 子句语法。

编写 SQL 查询时遇到问题。

这个想法是执行以下操作:如果某人拥有所有三个 *name-s,那么 fname 应该是三列的集合。

如果客户没有第二个名字,则 concat 仅采用姓氏和姓名列(以便更好地表示(。

问题是 pgAdmin 给出错误:"错误:错误:语法错误(:"如果"( 第 1 行:如果 (">

你能帮助解决提到的问题吗?

if (
select second_name from bank.person is NULL)
then (
select concat(name,' ',surname) as fname, age
from bank.person sp
where creation_date = (select max(creation_date) from bank.person) 
or creation_date = (select min(creation_date) from bank.person);)
else (
select concat(name,' ',second_name,' ',surname) as fname, age
from bank.person sp
where creation_date = (select max(creation_date) from bank.person) 
or creation_date = (select min(creation_date) from bank.person);)
end if;

SQL没有IF子句,但它确实有CASE表达式,在许多情况下可以用来做同样的事情。 我认为您将SQL本身与过程语言(如PL/pgSQL(混淆了,您可以在其中嵌入SQL。

你不需要 IF,只需使用concat_ws()- 它可以正确处理 NULL 值和空字符串。

select concat_ws(' ', name, second_name, surname) as fname, 
age
from bank.person 
where creation_date = (select max(creation_date) from bank.person) 
or creation_date = (select min(creation_date) from bank.person);

请注意,您可以将两个子选择合并为一个,从而使查询更加高效。


select concat_ws(' ', p.name, p.second_name, p.surname) as fname, 
p.age
from bank.person p
join (
select max(creation_date) as max_date, 
min(creation_date) as min_date
from bank.person
) t on p.creation_date in (t.max_date, t.min_date);

最新更新