Подтвердить что ты не робот

Возвращает значение, если запись не найдена

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

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

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

Любые предложения?

4b9b3361

Ответ 1

Инкапсулировать запрос в подзапросе, чтобы преобразовать "нет строки" в значение 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:

Ответ 2

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

SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)

Ответ 3

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