@ Laughing.Vergil находится на правильном пути, даже если его синтаксис откусил;)
Пока не отвечал ваш вопрос, я отвечу на этот вопрос, используя CTE
один раз в JOIN
себя, а также непосредственно , :D
Если вы правильно поняли, вы хотите, чтобы все значения были сдвинуты с левой стороны строки со всеми значениями NULL вправо. Я предпочел бы принять идею @ Laughing.Vergil, поскольку, если известные значения являются стабильной длиной, нет причин, по которым код должен быть ужасно сложным. т.е. LEN(Box1) = 2
В этом примере я использую первую таблицу, которую вы определили, и предположите, что ограничения в приложении не сработают, чтобы проиллюстрировать операции CTE
.
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
Результаты
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
Теперь захватывающая часть. Обновление/удаление из таблицы с использованием CTE
s. Для аргументов, давайте предположим, что только первый ящик может быть некорректным из-за того, как работает приложение.
WITH CTE AS (SELECT *
FROM #Example2
WHERE BOX1 NOT IN ((LEFT(Box1, 1))
+ (LEFT(Box1, 1))))
DELETE FROM CTE
Окончательные результаты
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
Хотя это было очень глупо, я надеюсь, что вы можете увидеть, как таблицы позади CTE
поражаются, который является своего рода прохладный.
Приветствие,
Это звучит как то, что вы должны делать на уровне представления, а не в базе данных –
Для Payee_ID-почему BOX4 пустой? Разве это не DD? и не будет ли Box3 быть DD? – scsimon
@scsimon: Нет, это то, что нужно. Если предыдущие поля пусты, переместите данные из столбцов, где у нас есть данные. поэтому для payee1, поскольку box1 равен null, а box2 - BB, BB перемещается в box1 и т. д. – user3294322