2012-01-08 3 views
4

Я отправил аналогичный вопрос некоторое время назад, и теперь, когда мне нужно обновить этот код, я снова задаю следующий вопрос. Предыдущий вопрос здесь:
Computed column based on nullable columnsВычислительная колонка (COALESCE vs CASE vs ISNULL)

Мои данные (Address1, Address2, City, State, Zip, Country) может иметь неполную информацию. То есть Я не могу гарантировать, что все данные, кроме State и Country, будут иметь данные.

Я хотел бы иметь вычисленные столбцы для FullAddress.

Раньше я использовал COALESCE, который отлично поработал, если все поля заполнены. Теперь, когда требования к данным были ослаблены, это уже не вариант (потому что мы заканчиваем повторными запятыми в FullAddress). Вот что я использовал ранее (примечание , я просто работаю с инструкциями SELECT здесь для удобства использования - преобразует в вычисленную колонку команду «alter table add», когда у меня есть что-то, что работает во всех случаях):

SELECT (((((COALESCE([Address1],'') 
    + COALESCE(', '+[Address2],'')) 
    + COALESCE(', '+[City],'')) 
    + COALESCE(', '+[State],'')) 
    + COALESCE(', '+[Zip],'')) 
    + COALESCE(', '+[Country],'')) AS FullAddress 
FROM Locations 

Теперь, я поставил вместе альтернативу, используя CASE, но он по-прежнему не работает на крайний случай, когда Address1 is NULL (проблема в том, что FullAddress будет «» в качестве первых двух символов)

SELECT CASE WHEN [Address1] IS NOT NULL THEN [Address1] ELSE '' END 
     + CASE WHEN [Address2] IS NOT NULL THEN ', ' + [Address2] ELSE '' END 
     + CASE WHEN [City] IS NOT NULL THEN ', ' + [City] ELSE '' END 
     + CASE WHEN [State] IS NOT NULL THEN ', ' + [State] ELSE '' END 
     + CASE WHEN [Zip] IS NOT NULL THEN ', ' + [Zip] ELSE '' END 
     + CASE WHEN [Country] IS NOT NULL THEN ', ' + [Country] ELSE '' END 
     AS [FullAddress] 
FROM Locations 

Я немного застрял в этом по внутр. Любые рекомендации, что попробовать дальше?

+0

В чем вопрос? –

+0

Мой вопрос: как я могу построить инструкцию так, что в случае отсутствия данных (например, отсутствует Address1), вычисленный столбец FullAddress не начинается с ',' –

ответ

6

вы можете использовать этот шаблон:

SELECT 
    ISNULL(Address1 + ', ', '') 
    + ISNULL(Address2 + ', ', '') 
    + ISNULL(City + ', ', '') 
    -- .... 
    AS FullAddress 

Результат concation NULL + ', 'NULL является =>Address1 + ', ' будет NULL или действительный адрес =>ISNULL(Address1 + ', ', '') будет пустая строка или действительный адрес.

+0

Yup, теперь имеет смысл, когда я смотрю на него - добавьте NULL для чего-либо в SQL, и он остается NULL. –

+2

Я не знаю, как «расслаблены» ваши требования к данным. Если, например, у вас есть только данные в столбце «Город», ваш результат будет иметь дополнительные ',' в конце. Возможно, вам стоит подумать об использовании функции, определяемой пользователем. – bfavaretto

2
SELECT STUFF(
     COALESCE(', ' + Address1, '') + COALESCE(', ' + Address2, '') + ... 
     1, 
     2, 
     '' 
     ) AS FullAddress 
FROM Locations 

Сцепленная строка будет либо пустым, либо начать с (запятой и пробелом). STUFF() удалит первые два символа и вернет остальную часть строки.

 Смежные вопросы

  • Нет связанных вопросов^_^