2010-05-26 16 views
64

Tworzyłem kolumnę obliczeniową dla wszystkich pól, z których niektóre są potencjalnie puste.Łączenie ciągów programu SQL Server z wartością zerową

Problem polega na tym, że jeśli dowolne z tych pól ma wartość null, cała obliczona kolumna będzie pusta. Rozumiem z dokumentacji Microsoft, że jest to oczekiwane i można je wyłączyć za pomocą ustawienia SET CONCAT_NULL_YIELDS_NULL. Jednak nie chcę zmienić tego domyślnego zachowania, ponieważ nie znam jego wpływu na inne części SQL Server.

Czy jest dla mnie sposób, aby sprawdzić, czy kolumna jest pusta i tylko dołączyć jej zawartość w obliczonej formuły kolumny, jeśli nie jest zerowy?

Odpowiedz

110

Można użyć ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '') 

Jeśli wartość kolumny/wyrażenia jest rzeczywiście NULL, wtedy druga wartość określona (tutaj: ciąg pusty) zostanie użyta.

+13

"Coalesce" to nazwa funkcji standardowej ANSI, ale ISNULL jest łatwiejsza do napisania. –

+1

I ISNULL wydaje się być odrobinę szybszy także na SQL Server - więc jeśli chcesz użyć go w funkcji, która łączy łańcuchy w kolumnę obliczeniową, możesz zrezygnować ze standardu ANSI i wybrać szybkość (zobacz Adam Machanic: http: //sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx) –

+0

Po prostu użyłem tego zapytania Isnull (,), to było dużo podczas łączenia wartości i jedna z nich była zerowa również stała się nieważna. – Sizons

27

Użyj COALESCE. Zamiast your_column użyj COALESCE(your_column, ''). Spowoduje to zwrócenie pustego łańcucha zamiast NULL.

6

ISNULL(ColumnName, '')

0

w SQL Server:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]') 

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL. 

Code Behind:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'"; 
string email = txtEmail.Text; 

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"') 
7

Chciałem przyczynić się powinno to ktoś szuka pomocy z dodawaniem separatory między strunami, w zależności od czy pole to NULL czy nie.

Więc na przykład tworząc adres jednego wiersza od oddzielnych polach

Address1, Address2, Address3, Miasto, kod pocztowy

w moim W przypadku, mam następujące obliczone kolumny, które wydaje się działać tak, jak chcę:

case 
    when [Address1] IS NOT NULL 
    then (((   [Address1]  + 
      isnull(', '+[Address2],'')) + 
      isnull(', '+[Address3],'')) + 
      isnull(', '+[City] ,'')) + 
      isnull(', '+[PostCode],'') 
end 

Mam nadzieję, że komuś pomóż!

+0

Jest tam sporo zbędnych brakujących zagnieżdżeń, które można usunąć. Kolejną wskazówką jest to, że można również usunąć instrukcję case, tak jakby adres1 był pusty, a całe wyrażenie będzie miało wartość null (chociaż posiadające instrukcję case zwraca uwagę, że może się to zdarzyć) – Alternator

38

Z SQL Server 2012 jest to znacznie łatwiejsze dzięki funkcji CONCAT.

Traktuje NULL jako pusty ciąg

DECLARE @Column1 VARCHAR(50) = 'Foo', 
     @Column2 VARCHAR(50) = NULL, 
     @Column3 VARCHAR(50) = 'Bar'; 


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/ 
+0

Dzięki! Tego właśnie potrzebowałem !! – Shiva

+0

Dla starszych wersji "CONCAT" nie jest uznaną wbudowaną nazwą funkcji ", więc użyj COALESCE – Savage

7

Można również użyć CASE - mój poniższy kod kontroli dla obu wartości null i pustych strun i dodaje separator tylko wtedy, gdy istnieje wartość do naśladowania:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 
10

Zastosowanie

SET CONCAT_NULL_YIELDS_NULL OFF 

i połączeniem wartości null do st pierścień nie będzie mieć wartości NULL.

Należy pamiętać, że jest to przestarzała opcja, której należy unikać. Aby uzyskać więcej informacji, zobacz numer documentation.

0

Miałem z tym również wiele problemów. nie mógł dostać pracy wykorzystując przykłady przypadków powyżej, ale to nie praca dla mnie:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),' ',' ') 

Wymień koryguje podwójne spacje spowodowanych przez złączenie pojedyncze przestrzenie nic między nimi. r/ltrim pozbywa się wszelkich spacji na końcach.

Powiązane problemy