Ableiten einer berechneten Spalte basierend auf mehreren nullbaren Spalten

7

Ich bin ein bisschen ein SQL-Neuling.

Ich habe versucht, eine automatisch generierte Spalte zu erstellen, die TAGaus 5 anderen Spalten aufgerufen wird , von denen einige NULL-Markierungen beibehalten können.

Die zum Erstellen der automatisch generierten Spalte verwendete Syntax lautet:

[Tag]  AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])

Dies wird automatisch OK generiert, wenn keine der fünf Spalten einen NULL-Wert beibehält. Wenn ich jedoch versuche, eine Zeile mit einer der Spalten zu erstellen, die einen NULL-Wert enthalten, funktioniert die automatische Generierung nicht und lässt die TAGSpalte leer, obwohl die Zeile erstellt wird OK mit allen einzelnen Spaltendaten.

Gibt es eine Möglichkeit, die automatische Generierung für NULL-Werte zu aktivieren?

Ian Chamberlain
quelle

Antworten:

8

Sie können die CONCATFunktion in SQL Server 2012 oder höher verwenden, die automatisch ignoriert NULLund die Eingaben bei Bedarf implizit in Zeichenfolgentypen konvertiert.

Beispiel :

CREATE TABLE #Demo
(
    [Tag Type] char(1) NOT NULL,
    [Parent Tag Type] char(1) NULL,
    [Tag Area No] integer NOT NULL,
    [Tag seq No] integer NOT NULL,
    [Tag Suffix] char(1) NULL,

    [Tag] AS 
        CONCAT([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
);

INSERT #Demo
    ([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
VALUES
    ('T', NULL, 1234, 1, NULL),
    ('T', 'P', 5678, 1, 'S');

SELECT * FROM #Demo AS D;

Ausgabe:

Tag-Typ | Übergeordneter Tag-Typ | Tag-Bereich Nr. | Tag seq No | Tag-Suffix | Etikett     
: ------- | : -------------- | ----------: | ---------: | : --------- | : -------
T | null             | 1234 | 1 | null        | T12341  
T | P | 5678 | 1 | S | TP56781S

... und für den Fall, dass das Beispiel vereinfacht wurde und ein Trennzeichen zwischen den Elementen stehen soll, lesen Sie CONCAT_WS()den in SQL Server 2017 eingeführten Check-out .

Paul White 9
quelle
6

Ja, Sie müssen ISNULLjedoch Folgendes verwenden:

ISNULL([Tag Type], '') +
ISNULL([Parent Tag Type], '') +
ISNULL([Tag Area No], '') +
ISNULL([Tag seq No], '') +
ISNULL([Tag Suffix], '')

Aber faire Warnung, wenn eine Zeile NULLüber das Ganze verteilt ist, erhalten Sie eine leere Zeichenfolge. Möglicherweise möchten Sie das Ganze ISNULLmit einem kanarischen Wert einwickeln , um dies bei Bedarf zu vermeiden.

Abhängig von den Datentypen müssen Sie CONVERTIhren Spalten möglicherweise auch einen Zeichenfolgentyp hinzufügen ISNULL, um Fehler zu vermeiden.

Erik Darling
quelle
Stimme vollkommen zu. Tipp: Wenn Sie dies auf diese Weise (oder auf die OP-Weise) tun, tritt ein Problem auf: Das Tag für Area = Null, Seq = 1 ist dasselbe wie Area = 1, Seq = Null. Das wird dir natürlich nie passieren - bis es passiert. Wie auch immer, es ist einfach zu beheben: Fügen Sie einfach ein Trennzeichen (ISNULL (…, '') + '~' + ISNULL ...) oder einen Wert für NULL hinzu, der bei realen Daten niemals auftreten wird. wie ISNULL (…, '~') + ISNULL ...
Stu