SQL if语句修复问题

时间:2012-04-02 07:57:54

标签: postgresql if-statement case

我有这个选择

insert into test(t_name)
(select users.first_name || '_' || users.last_name 
|| '_' || to_date($values.report_date, 'YYYY.MM.DD')
from users where users.id = $session.user_id)

按预期工作,除非我想要,如果users.first_name / users.last_name为null而user_id = 0则插入另一个字符串'admin'否则我会收到错误,因为它违反了列t_name上的非空约束。

任何建议都表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

在SELECT部分​​使用CASE:

insert into test (t_name) 
select case 
         when users.first_name is null and users.last_name is null and users.id=0 then 'admin'
         else users.first_name || '_' || users.last_name || '_' || to_date($values.report_date,'YYYY.MM.DD')
       end 
from users
where users.id = $session.user_id

如果您提到的所有条件必须是真实的或仅仅是其中之一,那么问题(对我而言)并不清楚。根据您的需要,您应该将AND更改为OR部分中的WHEN

(请注意,无需在()语句中附加SELECT {/ 1}}

答案 1 :(得分:1)

如果您使用MySQL,可以使用IFNULL。

INSERT INTO test(t_name)
(
    SELECT IFNULL(users.first_name || '_' || users.last_name || '_' || to_date($values.report_date, 'YYYY.MM.DD'), 'admin')
    FROM users
    WHERE users.id = $session.user_id
)

在MSSQL中有一个类似的ISNULL函数,我假设同样存在其他数据库系统的解决方案。