Вернуть значение, если запись не найдена - PullRequest
36 голосов
/ 11 ноября 2011

У меня есть это простое утверждение, которое работает:

SELECT idnumber FROM dbo.database WHERE number = '9823474'

Если номер не существует нигде в таблице, произойдет сбой. Я хотел бы добавить что-то к этому утверждению, которое говорит:
ЕСЛИ НЕТ ЗАПИСИ НАЙДЕНО, ВОЗВРАЩАЕТСЯ НУЛЬ ВМЕСТЕ БЕЗ СТРОКИ.

Есть предложения?

Ответы [ 4 ]

58 голосов
/ 11 ноября 2011

Инкапсулируйте запрос в подзапрос , чтобы преобразовать «без строки» в значение NULL.

Я проверял и проверял это с помощью PostgreSQL , SQL Server и MySQL . Также работает с SQLite .

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id;

В Oracle вы должны выбрать из фиктивной таблицы из 1 строки DUAL следующим образом:

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM DUAL;

Вы можете сделать то же самое в MySQL по причинам совместимости, но вам не нужно.
Похоже на Firebird :

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM RDB$DATABASE;

Это делается для DB2 (например, Комментарий Шона ):

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;

Альтернатива с UNION ALL

SELECT id FROM tbl WHERE id = 9823474
UNION  ALL
SELECT NULL -- FROM DUAL  -- for Oracle
FETCH FIRST 1 ROW ONLY;

Стандартный SQL, но я проверял это только с Postgres, который оценивает так:
Если в первом SELECT найдена строка, она возвращается. Postgres прекращает поиск новых строк, как только первая найдена из-за LIMIT 1 (FETCH FIRST 1 ROW ONLY).
Второй SELECT выполняется даже в том случае, если первый ничего не возвращает. Тип данных значения NULL определяется типом данных tbl.id автоматически.

О предложении LIMIT:

6 голосов
/ 25 марта 2013

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

SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)
3 голосов
/ 16 октября 2012
Select isnull(sum(Amount),0) as Amt from BeginningBalance where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesInvoices where CustomerID = @CustomerID
//Data Row Result if no data is present at Beginning Balance Table
// example 

Amt
2000  // amount from sales orders
1000  // amount from sales invoices

// if the 1st select statement return no data use this
SELECT (select sum(Amount) from BeginningBalance 
        where CustomerID = @CustomerID) as Amt
Union all
Select sum(Amount) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select sum(Amount) as Amt from SalesInvoices where CustomerID = @CustomerID

Результат:

Amt
NULL  // amount from BeginningBalance
2000  // amount from sales orders
1000  // amount from sales invoices
0 голосов
/ 02 апреля 2018

Я использую это для MySql

SELECT IFNULL(ColumnA,"1") AS ColumnA , COUNT(1) AS Total FROM table 
WHERE ID = 1 LIMIT 0, 1;
...