2013-11-16 4 views
0

В моем SQL-запросе я пытаюсь объединить две строки в моем предложении select. Вот ожидаемые результаты:sql server query concat string с '-'

col A col B Result 
null null & 
null ''  & 
null XYZ  XYC 
''  null & 
''  ''  & 
''  XYZ  XYC 
ABC  null ABC 
ABC  ''  ABC 
ABC  XYZ  ABC-XYC 

Моя задача заключается в следующем - как я могу получить «тире», чтобы показать, на последнем сценарии, а не другие?

Вот моя попытка:

DECLARE @ColA as varchar(10) 
DECLARE @ColB as varchar(10) 

set @ColA = null; set @ColB = null; select '&' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = null; set @ColB = ''; select '&' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = null; set @ColB = 'XYC'; select 'XYC' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = ''; set @ColB = null; select '&' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = ''; set @ColB = ''; select '&' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = ''; set @ColB = 'XYC'; select 'XYC' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = 'ABC';set @ColB = null; select 'ABC' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = 'ABC';set @ColB = ''; select 'ABC' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 
set @ColA = 'ABC';set @ColB = 'XYC'; select 'ABC-XYC' as 'Expected', COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') as 'Actual' 

Как вы думаете, что я должен сделать один гигантский случай, когда? У меня много таких столбцов, и это сделало бы невыносимым читать.

Спасибо!

ОБНОВЛЕНИЕ: если я использую случай, когда, тогда мой выбор выглядит так, что, похоже, работает, но будет больно.

select 
    case when (@ColA is not null and @ColA <> '') and 
      (@ColB is not null and @ColB <> '') 
     then @ColA + '-' + @ColB 
     else COALESCE(NULLIF(COALESCE(@ColA, '') + COALESCE(@ColB, ''), ''), '&') 
    end 

действительно надеется, что у кого-то есть предложения по улучшению!

+0

Какую версию SQL Server? –

+0

к сожалению, sql 2000 ... (хотя любопытно, есть ли какая-то новая функция в более поздних версиях SQL Server, которая решит эту проблему?) – Raymond

+0

SQL Server 2012 имеет 'CONCAT', который, возможно, упростил бы вещи. –

ответ

2

Не могли бы вы использовать функцию поиска в таком виде?

Select Case When isnull(ColA, '') + isnull(ColB, '') == '' Then '&' 
      When isnull(ColA, '') <> '' and isnull(ColB, '') <> '' Then ColA + '-' + ColB 
      Else isnull(ColA, '') + isnull(ColB, '') 
From Table1 
+0

до сих пор мне это нравилось, так как это было проще всего читать и понимать. – Raymond

0

Я думаю, что этот ответ не много отличается от одного из других, но вы можете попробовать это:

SELECT 
CASE 
    WHEN NULLIF(ColA,'') <> '' AND NULLIF(ColB,'') <> '' 
     THEN ColA + '-' + ColB 
    WHEN NULLIF(ColA,'') <> '' OR NULLIF(ColB,'') <> '' 
     THEN COALESCE(ColA,ColB) 
    ELSE '&' 
END