2011-02-10 9 views
8

Jeśli w instrukcji SELECT wybieram połączony ciąg, który używa wartości z tabel, z których wybieram, jaki jest najlepszy sposób obsługi NULL dla tych wartości, tak, że wciąż mam ciąg? Jak w, czy jestem wybierając miasto, województwo i kraj dla użytkownika i chcę trzecie pole, które je skleja wszystkie:T-SQL: Najlepszy sposób na obsługę wartości NULL w konkatenacji ciągów znaków

SELECT City, State, Country, 
City + ', ' + State + ', ' + Country AS 'Location' 
FROM Users 

Jednak „Lokalizacja” jest NULL, jeśli któryś z tych trzech pól jest NULL (zdarza się, gdy użytkownik nie jest z USA).

Moje obecne rozwiązanie jest takie:

SELECT City, State, Country, 
City + ', ' + COALESCE(State + ', ', '') + Country AS 'Location' 
FROM Users 

Ale nie byłem pewien, czy to był tylko siekać i jeśli jest to znacznie lepszy sposób to zrobić. Myśli?

+2

'coalesce' jest standardową praktyką w tym zakresie. W twoim przypadku potrzebujesz tylko 'isnull'. możliwy duplikat [SQL Server String Concatenation with Null] (http://stackoverflow.com/questions/2916791/sql-server-string-concatenation-with-null) btw – bzlm

+0

@bzlm Ups! Masz rację. Nie wiem, dlaczego nie pojawił się, gdy szukałem lub wszedł do tytułu. Być może dlatego, że konkretnie umieściłem "t-sql". Głosowanie w celu zamknięcia. Zawsze jest trochę dziwnie głosować, aby zamknąć własne pytanie. To łaskocze. – JoeCool

+0

@bzlm Odpowiedź na pytanie "duplikat" mnie nie ekscytuje. Nie dotyczy ograniczników między kolumnami. – RichardTheKiwi

Odpowiedz

13

Aby przewidywalny wyglądać prawidłowa przecinkami pomiędzy każdymi dwoma polami, można użyć tej formy

;with users(City, State, Country) as (
select 'a', null, 'c' union all 
select 'a', 'b', 'c' union all 
select null, null, 'c') 

-- ignore above this line 
SELECT City, State, Country, 
    STUFF(
     ISNULL(', ' + City, '')+ 
     ISNULL(', ' + State, '')+ 
     ISNULL(', ' + Country, ''), 1, 2, '') AS 'Location' 
FROM Users 

Wyjście

City State Country Location 
---- ----- ------- -------- 
a NULL c  a, c 
a b  c  a, b, c 
NULL NULL c  c 
+0

+1; nie brała pod uwagę możliwości, że wartości środkowe są zerowe, co z perspektywy czasu wydaje się dość oczywiste. –

+0

@Adam Bóg błogosławi 20/20 po fakcie! – RichardTheKiwi

+0

Jestem trochę zdezorientowany - czy powyższe słowa "ignoruj ​​powyżej tej linii" są niezbędne, aby zapytanie zadziałało? – JoeCool

2

Tak, to jest droga. Możesz także użyć isnull(), ale koalescencja jest bardziej standardowa. Możesz rozważyć, czy możesz mieć wartości zerowe również w mieście lub w kraju. Możesz również wziąć pod uwagę, że użytkownicy mogą mieć adresy wielopunktowe i mogą mieć więcej niż jedno miasto, województwo, kraj i być może odpowiednia tabela będzie lepsza dla tych informacji.

+1

Bardziej standardowy? Wymagany cytat. – bzlm

+1

@bzlm: Chociaż nie posunąłbym się aż tak daleko, aby powiedzieć, że jest "bardziej standardowy" (pod względem współczynnika rozpowszechnienia), ale generalnie jest to preferowana składnia dla nowego rozwoju, ponieważ obejmuje wszystkie przypadki, które obejmuje "ISNULL", jak również inne (łączenie dodatkowych opcji, które wymagałyby na przykład wielu instrukcji 'ISNULL'). Dodatkowo 'COALESCE' jest dostępne na SqlCE, natomiast' ISNULL' nie. –

+2

@Adam, @Bzlm, chyba że mamy do czynienia z SQLCE, żaden punkt nie przeciąga go. Btw, COALESCE ma pewne dynamiczne problemy z pisaniem na klawiaturze i wydajnością w porównaniu do IsNull, więc jeśli korzystasz z SQL Server (bez CE) i potrzebujesz tylko 2 wartości, nie zapuszczaj się niepotrzebnie do COALESCE. – RichardTheKiwi

3

Można użyć funkcji Concat w SQL 2012 i później

SELECT City, State, Country, 
Concat(City, ', ', State, ', ', Country) AS 'Location' 
FROM Users 
Powiązane problemy