Sql, где выполнение условия не работает

#sql #sql-server

Вопрос:

У меня есть следующая логика запросов

  1. Показывать комментарии, которые не удаляются
  2. Показывать комментарии, которые удаляются после создания, в течение 30 дней до сегодняшнего дня(Сегодня — Дата создания

Ниже приведена логика, которую я написал, но я не думаю, что она работает правильно.

 SELECT string_agg(
    CAST(CONCAT_WS(',',
     c.Id,
     COALESCE(c.ParentCommentId, 0),
     c.TotalRatingsCount,
     c.Pinned,
     c.IsDeleted,
     FORMAT(c.CreatedDate, 'yyyy-MM-dd HH:mm:ss')) AS VARCHAR(MAX))
 , '|')
FROM Comments c
WHERE c.DiscussionId = d.Id
and                             
((c.IsDeleted = 0 and DATEDIFF(day, c.CreatedDate , GETDATE()) >= 30))
or
(((c.IsDeleted = 1 or c.IsDeleted =0) and DATEDIFF(day, c.CreatedDate , GETDATE()) <= 30))
                            
 

Комментарии:

1. Почему вы не думаете, что это работает правильно? Если вы не уверены, как мы можем быть уверены, если мы не можем выполнить заявления?

2. Кроме того, эти WHERE пункты не подлежат обсуждению. Не используйте функции против ваших столбцов в WHERE .

3. condition1 и co-dition2 или condition3-это текущее утверждение. Ты хочешь этого? Если нет — посчитайте скобки. Или добавьте дополнительную пару. Просто чтобы убедиться, как это оценивается.

Ответ №1:

 SELECT string_agg(
    CAST(CONCAT_WS(',',
     c.Id,
     COALESCE(c.ParentCommentId, 0),
     c.TotalRatingsCount,
     c.Pinned,
     c.IsDeleted,
     FORMAT(c.CreatedDate, 'yyyy-MM-dd HH:mm:ss')) AS VARCHAR(MAX))
 , '|')
FROM Comments c
WHERE c.DiscussionId = d.Id
and                             
((c.IsDeleted = 0 )
or
((c.IsDeleted = 1 ) and DATEDIFF(day, c.CreatedDate , GETDATE()) <= 30))