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

위는 내 postgresql 데이터베이스에 대한 원시 원시 sql 쿼리입니다. 내 문제는 데이터베이스에서 null 인 경우 기본 file_path를 표시하려고합니다. 나는 이것을 위해 세 가지 방법을 시도했다 :postgresql + 레일에 대해 COALESCE (FIELD, "DEFAULT VALUE")가 작동하지 않습니다.

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, 

No !, 아무도 나에게 효과가 없으며 나는 그 이유를 모른다. 내가 여기서 무엇을 놓치고 있니?

[참고 : this screenshot 참조하시기 바랍니다]

정말 어떤 도움을 주셔서 감사합니다. 때문에 왼쪽

감사

+0

첫 번째 COALESCE 예가 정확합니다. 데이터베이스에서 직접 쿼리를 실행 해 보았습니까? 그것은 무엇을 반환합니까? – ninesided

+0

답장을 보내 주셔서 감사합니다. 데이터베이스에서 직접 시도해보고 알려 드리겠습니다. – przbadu

+0

postgres 데이터베이스의 file_path에 null 값이 반환됩니다. – przbadu

답변

2

나는 당신의 문제가 꽤 확신 오히려 유착보다, 가입 할 수 있습니다. 왼쪽 조인에 행이없는 경우 cover.file_path은 병합에 관계없이 null로 끝납니다.

더 적절한 위치로 병합 문을 옮겨보십시오 :

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

사례 fh.file_path가 NULL 인 경우 다음 '기본 이미지'ELSE fh.file_path end 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 

작품을 나를 위해 ... 야아!

관련 문제