Лучший способ написать запрос объединения при работе со значениями NULL и Empty String - PullRequest
2 голосов
/ 19 августа 2010

Мне нужно написать запрос, который выполняет объединение двух таблиц с похожими данными. Результаты должны быть отчетливыми. У меня проблема в том, что некоторые поля, которые должны быть одинаковыми, не относятся к пустым значениям. Некоторые обозначены как нулевые, а некоторые имеют пустые строковые значения. У меня вопрос, есть ли лучший способ выполнить следующий запрос? (без фиксации фактических данных, чтобы убедиться, что установлены правильные значения по умолчанию и т. д.) Будет ли использование варианта Когда большой удар по производительности?

Select  
    When Column1 = '' Then NULL Else Column1 as [Column1],
    When Column2 = '' Then NULL Else Column2 as [Column2]
From TableA

UNION ALL

Select 
    When Column1 = '' Then NULL Else Column1 as [Column1],
    When Column2 = '' Then NULL Else Column2 as [Column2]
From TableB

Ответы [ 4 ]

3 голосов
/ 19 августа 2010

Не думаю, что это повлияет на производительность, но NULLIF - еще один способ написать это, и, ИМХО, выглядит немного чище.

Select  
    NULLIF(Column1, '') as [Column1],
    NULLIF(Column2, '') as [Column2]
From TableA

UNION

Select 
    NULLIF(Column1, '') as [Column1],
    NULLIF(Column2, '') as [Column2]
From TableB
1 голос
/ 19 августа 2010

Используйте UNION для удаления дубликатов - это медленнее, чем UNION ALL для этой функции:

SELECT CASE 
         WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL
         ELSE column1
       END AS column1,
       CASE 
         WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL
         ELSE column2
       END AS column2
  FROM TableA
UNION 
SELECT CASE 
         WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL
         ELSE column1
       END,
       CASE 
         WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL
         ELSE column2
       END 
  FROM TableB

Я изменил логику, чтобы она возвращала NULL, если значение столбца содержит любое количество пробелов и не содержит фактического содержимого.

CASE выражения являются ANSI и более настраиваемы, чем синтаксис NULLIF / etc.

1 голос
/ 19 августа 2010

A Case должно работать нормально, но IsNull более естественно в этой ситуации. И если вы ищете отдельные строки, выполнение union вместо union all позволит это сделать (спасибо Jeffrey L Whitledge за указание на это):

select  IsNull(col1, '')
,       IsNull(col2, '')
from    TableA
union
select  IsNull(col1, '')
,       IsNull(col2, '')
from    TableB
0 голосов
/ 19 августа 2010

Вы можете хранить свои операции манипуляции отдельно от объединения, если вы делаете любые манипуляции, которые хотите (замените NULL на пустую строку) в отдельном представлении, а затем объединяете представления.

Вам не нужнооднако примените одинаковые манипуляции к обоим наборам.

Если это так, сначала объедините их, а затем примените манипуляцию к результирующему объединенному набору один раз.таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...