转换mysql查询也适用于postgresql

时间:2014-11-28 09:05:43

标签: php mysql postgresql

我有一个在mysql下运行良好的查询,我需要将此查询转换为以下工作:

SELECT u.*,
    ju.username,
    ju.email,
    ju.lastvisitDate as last_login,  
    team_leader.first_name  as leader_first_name,team_leader.last_name as leader_last_name, 
    team.leader_id as leader_id, 
    IF(team.name!='',team.name,team_leader.first_name || ' ' || team_leader.last_name) AS team_name 
FROM bpfsz_users AS u 
LEFT JOIN bpfsz_users AS ju ON ju.id = u.id 
LEFT JOIN bpfsz_teams AS team ON team.team_id = u.team_id 
LEFT JOIN bpfsz_users AS team_leader ON team_leader.id = team.leader_id

查询在postgreSQL下失败并显示错误消息"函数if(布尔值,字符变化,文本)不存在"

如何在mysql和postgresql中进行此查询?

先谢谢

2 个答案:

答案 0 :(得分:2)

Postgresql区分大小写。

您写道:"在bpfsz_users的表定义中,该列是nammed lastvisitDate"

因此,您必须将该列引用为:ju。" lastvisitDate"

检查案例。

if必须转换为:

CASE team.name
    WHEN '' THEN team_leader.first_name || ' ' || team_leader.last_name
    ELSE team.name
END AS team_name

答案 1 :(得分:0)

  

查询在postgreSQL下失败并显示错误消息"列ju.lastvisitdate不存在",在bpfsz_users的表定义中列为nammed lastvisitDate

PostgreSQL将不带引号的标识符折叠为小写。就PostgreSQL而言,所有这些都是相同的。

select current_date;
select Current_Date;
select CURRENT_DATE;

最简单的修复可能是将列重命名为" last_visit_date",并在所有查询中使用它。带有下划线以分隔单词的所有小写字母与其他标识符的样式更加一致,并且它可以避免您的问题。

要让PostgreSQL尊重您的大小写,请将标识符括在双引号中。

select "ju"."lastvisitDate"

但这会破坏MySQL,默认情况下会使用反引号来引用标识符。 IIRC,有一个MySQL服务器配置设置,使其使用双引号,但这比重命名列更有可能打破很多MySQL代码。


MySQL ANSI_QUOTES SQL mode使MySQL服务器在双引号之间的反引号之间解析文本作为标识符。这意味着您无法使用双引号来识别文字字符串。