2011-06-29 37 views
1
SELECT * 
    FROM myTable m 
WHERE m.userId = :userId 
    AND m.X = (SELECT MAX(X) 
       FROM myTable m 
       WHERE m.userId = :userId 
       AND m.contactNumber = :contactNumber)"; 

問題是,如果沒有這樣的行並且語句未能執行,則語句的第二部分計算爲null。我希望在這種情況下結果爲空。在子查詢中處理null null

解決此問題的一種方法是執行昂貴的filesort(按順序),然​​後在代碼級別獲取必需的字段。任何更好的解決這個問題?

回答

2

你可以使用ISNULL嗎?

和MX = ISNULL( '')

+0

我的不好,不知道關於IFNULL(相當於mysql和hibernate中的sql server的ISNULL)。所以做了一些像X =(選擇IFNULL(max(X),'')) – r15habh

0

我不知道你爲什麼在這裏得到空值,但試試這個:

SELECT myTable.*, IF myTableMax.myMaxX IS NOT NULL myTableMax.myMaxX ELSE "" 
    FROM myTable 
LEFT OUTER JOIN 
     (SELECT userID, contactNumber, MAX(X) AS myMaxX 
      FROM myTable 
     GROUP BY userID, contactNumber) AS myTableMax 
    ON myTable.userID = myTableMax.userID 
    AND myTable.contactNumber = myTableMax.contactNumber 
WHERE myTable.userID = :userID 
    AND myTable.contactNumber = :contactNumber 

如果你關心性能,添加mytable (userID, contactNumber)上的索引。