SSIS — производные столбцы

У меня есть один небольшой вопрос, я новичок, поэтому, пожалуйста, помогите мне.

В моем проекте у меня есть один текстовый файл с zip4 и zip5 , я хочу объединить оба почтовых индекса, но у него есть одна проблема: в каком-то месте zip4 пуст (не нуль), поэтому, когда я использовал производный столбец с

ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4) 

выражение, оно вернет

(zip5-)

где zip4 пусто, и я хочу только zip5 без -.

Пожалуйста, помогите мне.


person 343    schedule 05.09.2012    source источник
comment
Вы пытаетесь объединить в пакете Sql Server или SSIS?   -  person Praveen    schedule 05.09.2012


Ответы (2)


Пытаться

ISNULL([ZIP_4]) || LEN([ZIP_4]) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

or

ISNULL([ZIP_4]) || LEN(RTRIM(LTRIM([ZIP_4]))) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

Второй обрежет zip_4 с обеих сторон перед проверкой его длины.

person Piotr Sobiegraj    schedule 05.09.2012

Поведение, определенное ANSI, заключается в том, что любая операция, включающая null, за исключением явного теста на недействительность (is [not] null), дает значение null. К сожалению, поведение SQL Server по умолчанию нестандартно. Так...

Вы должны убедиться, что следующие два параметра включены для вашей хранимой процедуры или включены в вашем соединении, прежде чем выполнять автономный запрос:

  • set ansi_nulls on
  • set concat_nulls on

Если вы установите их в теле хранимой процедуры, настройки будут применяться только внутри этой хранимой процедуры; если вы установите их для соединения (путем выполнения инструкций set), они будут одними для всех запросов, выполняемых для этого соединения (за исключением того, что хранимые процедуры имеют свой собственный контекст выполнения).

Жаль, что вы не можете гарантировать, что отсутствующие данные всегда будут null, а не нулевой строкой (''), это упрощает логику.

В любом случае, как только вы включите правильное поведение `null, что-то вроде

-- if missing data is always NULL, do this
select zip9 = t1.zip5 + coalesce( '-'+t1.zip4 , '' )
from someTable t1

or

-- if missing data might be nil ('') or NULL, do this
select zip9 = t1.zip5
            + coalesce(
                '-'
                + case coalesce(t1.zip4,'') when '' then null else t1.zip4 end ,
                ''
                )
from someTable t1

должен сделать трюк.

В противном случае, если вы не хотите включать правильное поведение, вы можете сделать что-то вроде этого. Это будет работать и со стандартным поведением NULL. Мне просто это не нравится, так как это включает в себя несколько тестов. Но TMTOWTDI, как говорится.

select zip9 = t1.zip5
            + case
                when t1.zip4 = ''    then ''
                when t1.zip4 is null then ''
                else '-' + t1.zip4
              end
from someTable t1
person Nicholas Carey    schedule 05.09.2012
comment
Чтобы устранить сожаление, что вы не можете гарантировать, что отсутствующие данные всегда будут нулевыми, а не нулевой строкой, вы всегда можете использовать NULLIF, чтобы привести пустую строку к нулевому значению. - person billinkc; 05.09.2012
comment
@billinkc: как вы думаете, что делает стандартная функция coalesce()? - person Nicholas Carey; 05.09.2012
comment
Мои извинения, мозг отключился, пока я комментировал. NULLIF преобразует что-то в NULL, если значения совпадают, поэтому NULLIF(t1.zip4,'') вернет NULL для пустых строк, а также для значений NULL. Это позволяет использовать первый фрагмент кода t1.zip5 + coalesce('-'+NULLIF(t1.zip4, ''), '') вместо более подробного оператора case. - person billinkc; 05.09.2012