2013-12-19 1 views
1
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" 

Выше мой сырая SQL-запрос для моей базы данных PostgreSQL. Моя проблема заключается в том, что я хочу отобразить default_file_file, если он имеет значение null в базе данных. Я попробовал три способа для этого:COALESCE (FIELD, "DEFAULT VALUE") не работает для PostgreSQL + рельсов

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, 

Нет Luck !, ни один из них не работает для меня, и я не знаю, почему. Что мне здесь не хватает?

[Примечание: см this screenshot]

Действительно ценят за любую помощь.

Благодаря

+0

Ваш первый пример COALESCE верен, вы пытались выполнить запрос непосредственно в базе данных? Что он возвращает? – ninesided

+0

Спасибо за ваш ответ, я дам вам попробовать в базе данных напрямую и дам вам знать .. – przbadu

+0

Он возвращает значение null для файла_папки в базе данных postgres также – przbadu

ответ

2

Я почти уверен, ваша проблема из-за соединения слева, а не сливаются. Если левое соединение не дает строки, cover.file_path заканчивается нулевым, независимо от слияния или нет.

Попробуйте переместить заявление Coalesce в более подходящее место:

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 
... 
+0

Большое спасибо за это. теперь в базе данных postgres он работает нормально, но все же я не получаю ожидаемый результат на странице просмотра. – przbadu

+0

CASE WHEN fh.file_path IS NULL THEN 'default image' ELSE fh.file_path END AS file_path .. ... работает для меня, а не COALESCE() .... кстати, спасибо за много полезного для вашей помощи – przbadu

0
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 

работает для меня ... да ну!