SQL: функция ISNULL с параметрами другого типа

В SQL Server ISNULL() функция имеет параметры того же типа.

check_expression

Проверяется ли выражение на NULL. check_expression может быть любого типа.

восстановительная стоимость

Выражение, которое должно быть возвращено, если check_expression имеет значение NULL. replace_value должен иметь тот же тип, что и check_expression.

Как я могу использовать его с другим типом параметра? Я хочу использовать с параметрами date и string вот так ISNULL(A.DATE, '-')

ПРИМЕЧАНИЕ. Тип A.DATEdatetime.

EDIT-1: мой полный запрос, который получает 0 строк:

    SELECT A.pkey as KREDİ, A.SUMMARY , D.BayiStatu AS STATU, D.Sorumlu AS SORUMLU, C.BayiSonuc as SONUC, ISNULL( CONVERT(VARCHAR(25), A.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' ), dbo.CUSTVAL(11931, A.ID, 'S') AS BAYİ, ISNULL( CONVERT(VARCHAR(25), dbo.GetLastStatuTime(A.ID), 112) , '-' ) AS SON_STATU_TAR,j2.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j2.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j2.RESOLUTIONDATE, 112) , '-' ), j3.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j3.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j3.RESOLUTIONDATE, 112) , '-' )
FROM AspNetServicesDB.dbo.SONUC_MAP C, JİRA.resolution E, jira.issuestatus B, AspNetServicesDB.dbo.STATU_MAP D, Jira.jiraissue A
INNER JOIN Jira.issuelink i
    ON i.SOURCE = A.ID and i.SEQUENCE = 0
INNER JOIN Jira.jiraissue As j2
    ON i.DESTINATION =j2.ID 
LEFT JOIN Jira.issuelink i2 
    ON i2.SOURCE = A.ID  and i2.SEQUENCE = 1
LEFT JOIN Jira.jiraissue As j3 
    ON i2.DESTINATION = j3.ID
WHERE A.issuestatus = B.ID
AND 'BAŞARAN OTOMATİV' = dbo.CUSTVAL(11931, A.ID, 'S')
AND B.pname = D.JiraStatu collate Turkish_CS_AI
AND A.issuetype != 11
AND A.RESOLUTION = E.ID
AND E.pname = C.JiraSonuc collate Turkish_CS_AI

EDIT-2: Но это работает

select ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' )
FROM Jira.jiraissue A

Может быть причина JOIN ?


person Soner Gönül    schedule 01.11.2011    source источник
comment
Если select ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' ) работает, то проблема ISNULL(A.DATE, '-') решена. Теперь у вас другая проблема. Это означает другой вопрос.   -  person Bogdan Sahlean    schedule 01.11.2011
comment
Да, и я решил это. Спасибо!   -  person Soner Gönül    schedule 01.11.2011


Ответы (4)


Вы не можете. Функция ISNULL используется сама по себе как столбец результата запроса или в выражении, которое в конечном итоге становится столбцом результата запроса. Все поля/строки в столбце должны иметь один и тот же тип данных. Так что вам придется выбирать.

Одним из решений было бы преобразовать DATE в строку, чтобы результатом всегда была строка, но я считаю, что лучшим решением было бы возвращать NULL для пустых дат и позволить уровню представления решать, будет ли Даты NULL должны отображаться как - и в каком формате должны отображаться ненулевые даты (настройки локали клиента).

Под уровнем представления я подразумеваю все, что отображает или выводит эти данные, что может быть веб-страницей, экспортером CSV, инструментом отчетности и чем угодно.

person GolezTrol    schedule 01.11.2011
comment
Я использую в Gridview, и строка формата даты равна {0: f}. Как я могу использовать Gridview для проверки нуля или нет? - person Soner Gönül; 01.11.2011
comment
Я не очень разбираюсь в .NET, но я думаю, что вы должны иметь возможность указать форматирование столбца или, может быть, даже где-то сделать форматирование. Однако не могу быть уверен, никогда ничего не делал с этим GridView, но я был бы удивлен, если бы это было нелегко сделать. - person GolezTrol; 01.11.2011
comment
Вы хотели сказать IFNULL, когда вопрос касается ISNULL()? - person onedaywhen; 01.11.2011
comment
Изменил. Я имел в виду ту функцию, которая заменяет значение NULL другим значением, которое называется IFNULL, ISNULL, NVL или может быть другими именами, в зависимости от базы данных. ;) - person GolezTrol; 01.11.2011
comment
Да и NVL это Oracle. Но по сути это одна и та же функция. Я только что сделал опечатку. - person GolezTrol; 01.11.2011
comment
Я сам чувствую себя глупо, почему я не могу решить эту простую задачу. ISNULL(CONVERT(varchar(10), A.Date, 101),'-') почему это не работает до сих пор не понимаю. - person Soner Gönül; 01.11.2011
comment
@SonerGönül - Вы тестировали решение ISNULL (...) в SSMS? - person Bogdan Sahlean; 01.11.2011
comment
@BogdanSahlean Ага. ISNULL не работает из-за другого типа параметров. После этого я использую CONVERT как ISNULL(CONVERT(varchar(10), A.Date, 101),'-'), но все еще получаю 0 строк. Я чуть не убил себя :-) - person Soner Gönül; 01.11.2011
comment
Я решил это. Это самый старый верный ответ, и я принял его. Спасибо! - person Soner Gönül; 01.11.2011

Можете ли вы просто указать свою дату как varchar? Поскольку в любом случае ваш вывод может быть недействительной датой, это должно работать нормально:

ISNULL(CONVERT(varchar(10), A.Date, 101),'-')
person Code Magician    schedule 01.11.2011
comment
@SonerGönül: Вы используете это выражение в качестве фильтра (где-то в WHERE или ON)? - person Andriy M; 01.11.2011
comment
@AndriyM Я добавил полный запрос в свой вопрос. - person Soner Gönül; 01.11.2011

Вам нужно привести дату к строке, если вы действительно хотите - вместо null.

declare @T table(adate datetime)
insert into @T values(null)
insert into @T values(getdate())

select isnull(convert(varchar(23), adate, 126), '-')
from @T
person Mikael Eriksson    schedule 01.11.2011

Можешь попробовать:

 CASE WHEN A.DATE IS NULL
      THEN '-'
      ELSE CONVERT(VARCHAR(25), A.DATE, 112)
 END
person ypercubeᵀᴹ    schedule 01.11.2011