2014-10-11 84 views
0

我有此查詢:如果該值爲NULL,則返回上一級值

SELECT 
    `mp__reference`.`referenceid` 
    , `mp__reference`.`description` 
    , `mp__reference`.`starts` 
    , `mp__reference`.`ends` 
FROM 
    `mp`.`mp__portal` 
INNER JOIN `mp`.`mp__revision` ON (`mp__portal`.`revisionidfk` = `mp__revision`.`revisionid`) 
INNER JOIN `mp`.`mp__campaign` ON (`mp__revision`.`campaignidfk` = `mp__campaign`.`campaignid`) 
INNER JOIN `mp`.`mp__helperusergroupcampaign` ON (`mp__helperusergroupcampaign`.`campaignidfk` = `mp__campaign`.`campaignid`) 
INNER JOIN `mp`.`mp__usergroup` ON (`mp__helperusergroupcampaign`.`usergroupidfk` = `mp__usergroup`.`usergroupid`) 
INNER JOIN `mp`.`mp__helperuserusergroup` ON (`mp__helperuserusergroup`.`usergroupidfk` = `mp__usergroup`.`usergroupid`) 
INNER JOIN `mp`.`mp__user` ON (`mp__helperuserusergroup`.`useridfk` = `mp__user`.`userid`) 
INNER JOIN `mp`.`mp__position` ON (`mp__position`.`portalidfk` = `mp__portal`.`portalid`) 
INNER JOIN `mp`.`mp__group` ON (`mp__group`.`positionidfk` = `mp__position`.`positionid`) 
INNER JOIN `mp`.`mp__reference` ON (`mp__reference`.`groupidfk` = `mp__group`.`groupid`) 
WHERE userid = $_SESSION['userid'] 
AND MD5(groupid) = $_SESSION['groupid'] 

可以考慮實體:活動< - 修訂< - 位置< - 組< - 引用作爲「daisychained 「一起從上到下。

所有這些都包含屬性「開始」和「結束」。

我需要檢查是否設置了較低級別的值。如果沒有,它返回這樣的僞代碼的下一個上電平值:

if (reference.starts) then 
    return reference.starts 
else if (group.starts) then 
    return group.starts 
else if (position.starts) then 
    return position.starts 
etc... and the same thing for .ends 

是的,我可以提取所有的值,然後做一個後比較 - 但我想學習有效的SQL-查詢。

任何想法,非常感謝。

回答

3

退房的COALESCE功能:

COALESCE (reference.starts, group.starts, position.starts, ...); 

的第一個非NULL值將被退回。

+0

是的,工作完美無瑕。我其實早先嚐試過這個命令;不知怎的,肯定是用錯了。 – Anders 2014-10-11 09:35:43

+0

沒問題。另外,特別是如果你想與'null'以外的其他值比較 - 你可以看看'CASE ... WHEN ... THEN ...'函數(參見http://dev.mysql.com /doc/refman/5.5/en/control-flow-functions.html) – Trinimon 2014-10-11 09:46:01

相關問題