2010-09-13 10 views
29

Ich habe eine Tabelle und die Spalten in dieser Tabelle enthält leere Felder für einige Datensätze. Jetzt muss ich die Daten in eine andere Tabelle verschieben und die leeren Leerzeichen durch einen NULL Wert ersetzen.Wie konvertiert man leere Leerzeichen in NULL-Werte mit SQL Server?

Ich habe versucht, zu verwenden:

REPLACE(ltrim(rtrim(col1)),' ',NULL) 

aber es funktioniert nicht. Es konvertiert alle Werte von col1 in NULL. Ich möchte nur die Werte mit leeren Leerzeichen in NULL konvertieren.

Antwort

32

Haben Sie das versucht?

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

Da die Kommentatoren weisen darauf hin, Sie haben nicht ltrim() oder rtrim() und NULL Spalten zu tun, wird nicht '' entsprechen.

+4

Sie brauchen noch nicht einmal RTRIM zu verwenden. SQL Server ignoriert nachfolgende Leerzeichen beim Vergleichen von Zeichenfolgen. –

+0

@Bennor McCarthy: wow, ich bin wirklich rutscht ... werde diesen Satz jetzt fallen – egrunin

+0

Nicht wirklich ein großes Problem. Es ist nicht so, dass die Leistung oder die Verwendung von Indizes wirklich ein Problem für die Abfrage darstellt. Deine Antwort war trotzdem immer noch korrekt. :) –

6

Vielleicht so etwas?

UPDATE [MyTable] 
SET [SomeField] = NULL 
WHERE [SomeField] is not NULL 
AND LEN(LTRIM(RTRIM([SomeField]))) = 0 
8

A Case-Anweisung sollte es tun, wenn sie von Ihrer Quelltabelle auswählen:

CASE 
    WHEN col1 = ' ' THEN NULL 
    ELSE col1 
END col1 

Auch eine Sache zu beachten ist, dass Ihr LTRIM und RTRIM den Wert von einem Raum verringern (‘‚) zu leeren (''). Wenn Sie Leerraum entfernen müssen, dann sollte die Case-Anweisung entsprechend modifiziert werden:

CASE 
    WHEN LTRIM(RTRIM(col1)) = '' THEN NULL 
    ELSE LTRIM(RTRIM(col1)) 
END col1 
-1

hier ist ein regex eine für ya.

findet im Wesentlichen alle Spalten, die keine Buchstaben oder Zahlen enthalten und auf null setzen. muss möglicherweise aktualisiert werden, wenn Sie Spalten mit nur Sonderzeichen haben.

+2

Ich denke, Sie haben Ihre eigene Frage beantwortet, warum dies eine schlechte Idee ist. – MikeKulls

19

SQL Server ignoriert nachfolgende Leerzeichen beim Vergleich von Zeichenfolgen, also '' = ''. Verwenden Sie einfach die folgende Abfrage für das Aktualisierungs-

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

NULL-Werte in der Tabelle wird NULL bleiben und col1s mit einer beliebigen Anzahl an Raum nur Zeichen wird auf NULL geändert werden.

Wenn Sie es während Ihrer Kopie von einem Tisch zum anderen tun möchten, verwenden Sie diese:

INSERT INTO newtable (col1, othercolumn) 
SELECT 
    NULLIF(col1, ''), 
    othercolumn 
FROM table 
+0

IMO das ist die beste Antwort. In der Frage wurde gefragt, wie die leeren Zeichenfolgen während der Kopie in null konvertiert werden. Die akzeptierte Antwort ist nicht gut, weil sie es in zwei Schritten tut, was nicht nur weniger effizient ist, sondern auch verhindert, dass der DBA eine Einschränkung hinzufügt, um sicherzustellen, dass keine leeren Zeichenfolgen vorhanden sind. – MikeKulls

+0

Ich stimme zu, dass die zweite Frage hier wirklich die Antwort ist, die am besten zu der Frage passt, obwohl meine Antwort die akzeptierte war. – egrunin

77

ich ein ähnliches Problem mit NULLIF Funktion gelöst:

UPDATE table 
SET col1 = NULLIF(col1, '') 

From the T-SQL reference:

NULLIF gibt den ersten Ausdruck zurück, wenn die beiden Ausdrücke nicht gleich sind. Wenn die Ausdrücke gleich sind, gibt NULLIF einen Nullwert des Typs des ersten Ausdrucks zurück.

+0

http://technet.microsoft.com/en-us/library/ms177562.aspx –

+3

Der große Nachteil ist, dass alle Zeilen in der Tabelle aktualisiert werden, anstatt nur die Zeilen, die die Änderung benötigen. – Trisped

+1

@Trisped: Sicher, aber es ist eine großartige Option für diejenigen von uns, die etwas Ähnliches in einer 'INSERT'-Anweisung machen wollen. – Ellesedil

7

Dieser Code erzeugt eine SQL, die diese auf jedem Tisch und Spalte in der Datenbank erreichen kann:

SELECT 
    'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL 
    WHERE [' + COLUMN_NAME + '] = ''''' 
FROM 
    INFORMATION_SCHEMA.columns C 
INNER JOIN 
    INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA 
WHERE 
    DATA_TYPE IN ('char','nchar','varchar','nvarchar') 
AND C.IS_NULLABLE='YES' 
AND T.TABLE_TYPE='BASE TABLE' 
+1

Ihr Skript ist großartig, auch Sie können hinzufügen: 'WHERE ['+ COLUMN_NAME +'] '+' NICHT LIKE '+' ''% [az, 0-9]% '' '' – GeorgesC

+0

Danke, was macht das Regex tun? – gls123

Verwandte Themen