Mysql 合并(字段“默认值”)不适用于postgresql+;轨道

Mysql 合并(字段“默认值”)不适用于postgresql+;轨道,mysql,sql,postgresql,ruby-on-rails-3.2,Mysql,Sql,Postgresql,Ruby On Rails 3.2,上面是我对postgresql数据库的原始sql查询。我的问题是,如果数据库中的默认文件路径为空,我想显示它。为此,我尝试了三种方法: sql = "SELECT DISTINCT(p.*), concat(u.first_name,' ',u.last_name) as fullname, concat('@',u.username) as username, cover.file_path, cover.file_type, avatar.avatar_path FROM p

上面是我对postgresql数据库的原始sql查询。我的问题是,如果数据库中的默认文件路径为空,我想显示它。为此,我尝试了三种方法:

sql = "SELECT DISTINCT(p.*), concat(u.first_name,' ',u.last_name) as fullname, concat('@',u.username) as username, cover.file_path, cover.file_type, avatar.avatar_path 
       FROM products p
       JOIN stores s ON s.id = p.store_id
       JOIN users u ON u.id = s.user_id
       LEFT OUTER JOIN (SELECT fh.product_id AS cp_id, 
       coalesce(fh.file_path, 'default image path') AS file_path,
       fh.file_type AS file_type FROM file_handlers fh WHERE is_cover = true) cover ON p.id = cover.cp_id
       LEFT OUTER JOIN (SELECT fh.id AS av_id, fh.file_path AS avatar_path FROM file_handlers fh WHERE is_cover = false) avatar ON u.avatar_id = avatar.av_id"
不走运!,这些都不适合我,我也不知道为什么。我错过了什么


[注意:请参阅]

我很确定您的问题是由于左连接,而不是合并。如果左连接不产生行,
cover.file_path
将以null结束,而不管是否合并

尝试将coalesce语句移动到更合适的位置:

1. COALESCE(fh.file_path, 'default image') AS file_path,
2. COALESCE(NULLIF(fh.file_path, ''), 'default image') AS file_path,
3. CASE WHEN fh.file_path IS NULL THEN 'default image' ELSE fh.file_path END AS file_path,

为我工作…耶

您的第一个合并示例是正确的,您是否尝试过直接在数据库上执行查询?它会返回什么?谢谢你的回复,我会直接在数据库中尝试一下,并让你知道..它会为postgres数据库中的文件路径返回空值,这也非常感谢。现在在postgres数据库中,它工作正常,但我仍然无法在查看页面中获得预期的结果。如果fh.file\u路径为空,则“默认图像”否则fh.file\u路径结束为file\u路径。。。对我有效,而不是联合()。。。。顺便说一下,非常感谢奥利的帮助
sql = "SELECT DISTINCT(p.*), concat(u.first_name,' ',u.last_name) as fullname, concat('@',u.username) as username, coalesce(cover.file_path, 'default image path'), cover.file_type, avatar.avatar_path 
FROM products p
...
SELECT DISTINCT(p.*), concat(u.first_name,' ',u.last_name) as fullname, 
CASE 
  WHEN 
    cover.file_path IS NULL AND cover.file_type='image' 
  THEN 
    'DEFAULT IMAGE PATH' 
  WHEN
    cover.file_path IS NULL AND cover.file_type='audio' 
  THEN 
    'DEFAULT AUDIO PATH' 
  WHEN
    cover.file_path IS NULL AND cover.file_type='video' 
  THEN 
    'DEFAULT VIDEO PATH'
  ELSE 
    cover.file_path 
END,     
CASE 
  WHEN avatar.avatar_path IS NULL 
  THEN 'avatar.png' 
  ELSE avatar.avatar_path 
END
FROM products p
JOIN stores s ON s.id = p.store_id
JOIN users u ON u.id = s.user_id
LEFT OUTER JOIN (SELECT fh.product_id AS cp_id, fh.file_path AS file_path, fh.file_type AS  file_type FROM file_handlers fh WHERE is_cover = true) cover ON p.id = cover.cp_id
LEFT OUTER JOIN (SELECT fh.id AS av_id, fh.file_path AS avatar_path FROM file_handlers fh WHERE is_cover = false) avatar ON u.avatar_id = avatar.av_id