SQL: функция ISNULL с различными типами параметров - PullRequest
1 голос
/ 01 ноября 2011

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

check_expression

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

replace_value

Является ли выражение, которое должно быть возвращено, если check_expression имеет значение NULL.Замена_значение должно иметь тот же тип, что и check_expresssion .

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

ПРИМЕЧАНИЕ : тип A.DATE равен datetime.

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?

Ответы [ 5 ]

4 голосов
/ 01 ноября 2011

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

ISNULL(CONVERT(varchar(10), A.Date, 101),'-')
4 голосов
/ 01 ноября 2011

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

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

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

3 голосов
/ 01 ноября 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
1 голос
/ 01 ноября 2011

Я бы преобразовал значения DATE из [DATE]TIME в VARCHAR, используя CONVERT / CAST :

SELECT ... ISNULL( CONVERT(VARCHAR(25), A.DATE, 112) , '-' ) AS DATE
FROM ...

Вместо 112 стиля (гггммдд) можно использовать другой стиль: 103 (дд / мм / гггг), 101 (мм / дд / гггг) или другой стиль из Date and Time Styles сечение .

1 голос
/ 01 ноября 2011

Вы можете попробовать:

 CASE WHEN A.DATE IS NULL
      THEN '-'
      ELSE CONVERT(VARCHAR(25), A.DATE, 112)
 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...