Почему мой запрос на объединение столбцов возвращает NULL? (SQL на StackExchange DataExplorer)
Я написал запрос StackExchange DataExplorer, чтобы перечислить все комментарии пользователя. Идентификатор запроса работает и возвращает Id
с questions
а также answers
, Я не понимаю, почему, для answers
, второй столбец пуст.
DECLARE @UserId int = ##UserId##
Select p.Id
, '<a href=https://stackru.com/questions/'
+ Cast(p.Id as varchar(20)) + '>'
+ Cast(p.Id as varchar(20))
+ ' - ' + p.Title + '</a>'
, c.Text
FROM Users u
Join Comments c ON c.UserId = @UserId
JOIN Posts p ON p.Id = c.PostId
where u.Id = @UserId AND p.Id IS NOT NULL
Даже если предположить, что столбец p.Title
NULL столбец p.Id
не NULL, и поэтому я ожидал бы, что эта часть
'<a href=https://stackru.com/questions/'
+ Cast(p.Id as varchar(20)) + '>'
+ Cast(p.Id as varchar(20))
+ ' - ' + p.Title + '</a>'
вернул бы что-нибудь согласно этому вопросу. Но второй столбец совершенно пуст.
Почему это так?
1 ответ
Даже если предположить, что столбец p.Title имеет значение NULL
Что это за те строки.
столбец p.Id не равен NULL, и поэтому я ожидаю, что [результат будет чем-то не нулевым]
Нету. Если вы объедините NULL
с чем-либо в SQL Server, используя +
оператор, то вы в конечном итоге получить NULL
кроме если concat_null_yields_null
является OFF
,
Вы можете использовать CONCAT
функция вместо Это также избавляет от необходимости CAST
DECLARE @UserId INT = ##UserId##
SELECT p.Id,
CONCAT('<a href=http://stackru.com/questions/',
p.Id,
'>',
p.Id,
' - ',
p.Title COLLATE SQL_Latin1_General_CP1_CI_AS,
'</a>'),
c.Text
FROM Users u
JOIN Comments c
ON c.UserId = @UserId
JOIN Posts p
ON p.Id = c.PostId
WHERE u.Id = @UserId
AND p.Id IS NOT NULL