Мне нужен SQL-запрос, который возвращает ContactDate, SortName, City, ContactType и Summary из таблиц ниже. Если какое-либо значение равно нулю, мне нужно, чтобы оно вернуло текст «Нет записи».
КонтактыТаблица
Таблица пользователей
AddressTable


SELECT COALESCE(CAST(CONVERT(VARCHAR(10), ContactTable.ContactDate, 101) AS VARCHAR(10)), 'No Entry') AS ContactDate,
COALESCE(ContactTable.SortName, 'No Entry') AS SortName,
COALESCE(AddressTable.City, 'No Entry') AS City,
COALESCE(ContactTable.ContactType, 'No Entry') AS ContactType
FROM ContactTable
LEFT OUTER JOIN UserTable ON ContactTable.UserID = UserTable.UserID
LEFT OUTER JOIN AddressTable ON UserTable.AddressID = AddressTable.AddressID
Здесь - это диаграмма форматов SQL DateTime для приведенного выше оператора CONVERT.
Это вызовет исключения для даты.
SELECT
ISNULL(ContactDate, 'No Entry') AS ContactDate
FROM Table
Использовать ISNULL довольно просто.
Этот код выйдет из строя, если ContactDate имеет значение null. «Ошибка преобразования при преобразовании даты и времени из символьной строки». Вам нужно привести к varchar.
COALESCE () на любой платформе, которая на вес соли.
Обязательно решите проблемы с трансляцией.
Такие как:
--(SQL Server)
SELECT
C.ContactID,
COALESCE(CAST(CONVERT(varchar(10), C.ContactDate, 101) AS varchar(10), 'No Entry') AS ContactDate,
COALESCE(SorName, 'No Entry') AS SortName
и т.д. и т.п.
На данный момент это единственный ответ, который учитывает тот факт, что вам нужно вернуть столбцы, отличные от varchar, в varchar для использования с coalesce / isnull.
Вам не хватает близкого парена после второго varchar (10). Мы оба проигрываем из-за разгильдяйства! ;-)
Да, вот что я получаю, набирая его в поле для ответа :)
Использование «IIF» является решением для Access DB, но может работать в других DB.
SELECT IIF(IsNull(Foo), 'No Entry' ,Foo), IIF(IsNull(Bar), 'No Entry' ,Bar) From TableName
Функция IIF возвращает одно из двух значений в зависимости от оценки выражения. Синтаксис SQL: IIF (выражение; истинное значение1; ложное значение)
Версия этой функции Oracle называется nvl. То же использование - SELECT nvl(col_name, desired_value) FROM foo.
Более общая версия этого - decode, который имеет три параметра и позволяет вам указать, какое значение столбца вы хотите заменить (чтобы вы могли заменить все «Johnny» на «John» или что-то в этом роде).
Вы также можете делать разные вызовы для каждого столбца. Потребуется больше индивидуальных вызовов, но это может быть быстрее, если у вас не так много строк для обновления.
update ContactTable set ContactDate = 'No Entry' where ContactDate is null;
Повторите для каждого столбца.
MS SQL 2000 в конечном итоге переходит на Crystal Reports 8.0