@ Laughing.Vergil ist auf dem richtigen Weg, auch wenn seine Syntax ein bisschen weg ist;)
Obwohl nicht in Frage gepostet, werde ich diese Frage beantworten selbst mit CTE
einmal im JOIN
und auch direkt . :D
Wenn ich Sie richtig verstehe, möchten Sie, dass alle Werte auf die linke Seite der Zeile mit allen NULL-Werten auf der rechten Seite geschoben werden. Ich werde entscheiden, @ Laughing.Vergils Idee zu nehmen, denn wenn die bekannten Werte stabile Länge sind, gibt es keinen Grund, dass der Code furchtbar kompliziert sein muss. d. h. LEN(Box1) = 2
In diesem Beispiel verwende ich die erste von Ihnen definierte Tabelle und stelle mir vor, dass die Einschränkungen in der Anwendung fehlschlagen, um die Operationen CTE
zu veranschaulichen.
CREATE TABLE #Example (Payee_ID INT,
BOX1 VARCHAR(2) NULL,
BOX2 VARCHAR(2) NULL,
BOX3 VARCHAR(2) NULL,
BOX4 VARCHAR(2) NULL)
INSERT INTO #Example(Payee_ID, BOX1, BOX2, BOX3, BOX4)
VALUES (1, NULL, 'BB', NULL, 'DD')
, (2, 'AA', NULL, NULL, 'DD')
, (3, NULL, 'BB', 'CC', 'DD')
, (4, 'AA', 'BB', NULL, 'DD')
, (5, 'AA', 'BB', 'CC', 'DD')
, (6, NULL, 'CB', NULL, 'DD') -- the bad input
;WITH C as (
SELECT
Payee_ID
, ISNULL(Box1, '') + ISNULL(Box2, '') + ISNULL(Box3, '') + ISNULL(Box4, '') AS BOX
FROM #Example
)
UPDATE A
SET
BOX1 = IIF(SUBSTRING(Box, 1, 2) = '', NULL, SUBSTRING(Box, 1, 2))
, BOX2 = IIF(SUBSTRING(Box, 3, 2) = '', NULL, SUBSTRING(Box, 3, 2))
, BOX3 = IIF(SUBSTRING(Box, 5, 2) = '', NULL, SUBSTRING(Box, 5, 2))
, BOX4 = IIF(SUBSTRING(Box, 7, 2) = '', NULL, SUBSTRING(Box, 7, 2))
FROM #Example A
INNER JOIN C ON C.Payee_ID = A.Payee_ID
Ergebnisse
Payee_ID BOX1 BOX2 BOX3 BOX4
1 BB DD NULL NULL
2 AA DD NULL NULL
3 BB CC DD NULL
4 AA BB DD NULL
5 AA BB CC DD
6 CB ED NULL NULL
nun der spannende Teil. Aktualisieren/Löschen aus einer Tabelle mit CTE
s. Nehmen wir an, dass wegen der Funktionsweise der Anwendung nur die erste Box ungültig sein kann.
WITH CTE AS (SELECT *
FROM #Example2
WHERE BOX1 NOT IN ((LEFT(Box1, 1))
+ (LEFT(Box1, 1))))
DELETE FROM CTE
Finale Ergebnisse
Payee_ID BOX1 BOX2 BOX3 BOX4
1 BB DD NULL NULL
2 AA DD NULL NULL
3 BB CC DD NULL
4 AA BB DD NULL
5 AA BB CC DD
Während dies sehr dumm war, ich hoffe, Sie können sehen, wie die Tabellen hinter dem CTE
betroffen sind, was irgendwie cool ist.
Cheers,
Das klingt wie etwas, sollten Sie in der Präsentationsschicht und nicht in der Datenbank –
Für Payee_ID 1 Warum ist box4 leer tun? Sollte es nicht DD sein? und würde Box3 nicht DD sein? – scsimon
@scsimon: Nein, das ist die Voraussetzung. Wenn die vorherigen Felder leer sind, verschieben Sie die Daten aus den Spalten, in denen Daten enthalten sind. Also, für payee1, da box1 ist null und box2 ist BB, BB wird in box1 und so weiter verschoben. – user3294322