Запустить оператор equals и isnull в одном запросе - PullRequest
0 голосов
/ 17 июня 2019

У меня есть этот запрос

 DECLARE @LastDesignKey INT = (SELECT TOP 1 
                                   MAX([DesignKey])
                               FROM [Design] AS [D]
                               INNER JOIN [DesignGroup] AS [DG] ON [D].[DesignGroupId] = [DG].[DesignGroupId]
                               INNER JOIN [DesignType] AS [DT] ON [D].[DesignTypeGuid] = [DT].[DesignTypeGuid]
                               WHERE [D].[ParentDesignKey] = @ParentDesignKey 
                                 AND [DT].[Abbreviation] = @DesignTypeName
                                 AND [DG].[ProjectKey] = @ProjectKey)

Чтобы проверить его, я добавил статические переменные:

 DECLARE @ParentDesignKey INT = NULL, 
         @DesignTypeName VARCHAR(266) = 'BD',
         @ProjectKey INT = 4395


DECLARE @LastDesignKey INT = (SELECT TOP 1 MAX([DesignKey])
                              FROM [Design] AS [D]
                              INNER JOIN [DesignGroup] AS [DG] ON [D].[DesignGroupId] = [DG].[DesignGroupId]
                              INNER JOIN [DesignType] AS [DT] ON [D].[DesignTypeGuid] = [DT].[DesignTypeGuid]
                              WHERE [D].[ParentDesignKey] = @ParentDesignKey
                                AND [DT].[Abbreviation] = @DesignTypeName
                                AND [DG].[ProjectKey] = @ProjectKey)

  SELECT @LastDesignKey

Как вы можете видеть в моем предложении where, у меня есть WHERE [D].[ParentDesignKey] = @ParentDesignKey, но@ParentDesignKey переменная иногда может быть нулевой, поэтому мой результат неверен, потому что для проверки нулевого вы не можете использовать:

НЕПРАВИЛЬНОЕ использование:

 WHERE [D].[ParentDesignKey] = NULL

ПРАВИЛЬНОЕ использование

  WHERE [D].[ParentDesignKey] IS NULL

Что я могу сделать в своем запросе для поддержки IS NULL и =?Привет

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Вы можете добавить явную логику:

WHERE ([D].[ParentDesignKey] = @ParentDesignKey OR [D].[ParentDesignKey] IS NULL AND @ParentDesignKey IS NULL) OR
      ([DT].[Abbreviation] = @DesignTypeName OR [DT].[Abbreviation] IS NULL AND @DesignTypeName IS NULL) OR
      ([DG].[ProjectKey] = @ProjectKey OR [DG].[ProjectKey] IS NULL AND @ProjectKey IS NULL)

Обратите внимание, что если вы зависите от показателей производительности, это снизит производительность.В этом случае вы, вероятно, захотите использовать не-1004 * значение по умолчанию.

0 голосов
/ 18 июня 2019

Вы можете просто добавить или обнулить переменную

   DECLARE @ParentDesignKey INT = NULL, 
             @DesignTypeName VARCHAR(266) = 'BD',
             @ProjectKey INT = 4395


    DECLARE @LastDesignKey INT = (SELECT TOP 1 MAX([DesignKey])
                                  FROM [Design] AS [D]
                                  INNER JOIN [DesignGroup] AS [DG] ON [D].[DesignGroupId] = [DG].[DesignGroupId]
                                  INNER JOIN [DesignType] AS [DT] ON [D].[DesignTypeGuid] = [DT].[DesignTypeGuid]
                                  WHERE (      [D].[ParentDesignKey] = @ParentDesignKey 
                                          or ( [D].[ParentDesignKey] is null  and @ParentDesignKey is null )
                                         )
                                    AND [DT].[Abbreviation] = @DesignTypeName
                                    AND [DG].[ProjectKey] = @ProjectKey)

      SELECT @LastDesignKey
0 голосов
/ 17 июня 2019

Вы можете использовать OR ... IS NULL условие:

WHERE ([D].[ParentDesignKey] = @ParentDesignKey OR  @ParentDesignKey IS NULL)
  AND ([DT].[Abbreviation] = @DesignTypeName OR @DesignTypeName IS NULL)
  AND ([DG].[ProjectKey] = @ProjectKey OR @ProjectKey IS NULL)
OPTION(RECOMPILE) -- to force using actual values instead of parameters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...