Почему мой запрос на объединение столбцов возвращает 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 
Другие вопросы по тегам