Обработка нуля в подзапросе - PullRequest
1 голос
/ 29 июня 2011
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)";

Проблема в том, что вторая часть оператора оценивается как ноль, если такой строки нет, и оператор не выполняется. Я хочу, чтобы в таком случае результат был пустым.

OneЧтобы решить эту проблему, нужно выполнить дорогую сортировку файлов (упорядочить по), а затем извлечь необходимое поле на уровне кода.Есть ли лучшее решение этой проблемы?

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Можете ли вы использовать ISNULL?

и m.X = ISNULL (, '')

0 голосов
/ 29 июня 2011

Я не уверен, почему вы получаете NULL, но попробуйте это:

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).

...