Вычисляемый столбец (COALESCE против CASE против ISNULL) - PullRequest
4 голосов
/ 08 января 2012

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

Мои данные (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

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

Ответы [ 2 ]

6 голосов
/ 08 января 2012

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

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

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

2 голосов
/ 08 января 2012
SELECT STUFF(
         COALESCE(', ' + Address1, '') + COALESCE(', ' + Address2, '') + ...
         1,
         2,
         ''
       ) AS FullAddress
FROM Locations

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

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