Обновить с помощью sub select - Как обрабатывать значения NULL? - PullRequest
9 голосов
/ 17 июня 2011

Я пытаюсь выполнить обновление с условным вложенным выбором, который может вернуть ноль ...

UPDATE 
aTable SET 
aColumn = 
(   
    SELECT TOP 1    
        CASE 
            WHEN bTable.someColumn = 1 THEN someValue1 
            WHEN bTable.someColumn = 2 THEN someValue2 
            ELSE someValue3
        END  
    FROM         
        bTable
    WHERE
        bTable = @someCriteria
    ORDER BY
        someSortColumn
) WHERE 
aTable.id = @someId;

Если предложение "bTable = @someCriteria" не приводит к возвращению результатов из SELECT, он пытается вставить NULL в "aColumn", который в данном случае является столбцом NOT NULL.

Вопрос

Как мне заставить это просто оставить aColumn в таком случае?

Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 17 июня 2011
...
aColumn = 

    ISNULL(
        (   
            SELECT TOP 1    
                CASE 
                    WHEN bTable.someColumn = 1 THEN someValue1 
                    WHEN bTable.someColumn = 2 THEN someValue2 
                    ELSE someValue3
                END  
            FROM         
                bTable
            WHERE
                bTable = @someCriteria
            ORDER BY
                someSortColumn
        ), aColumn)
...
3 голосов
/ 17 июня 2011
UPDATE A SET 
aColumn = B.Value 
FROM aTable AS A
  CROSS JOIN  
            (   
                SELECT TOP 1    
                    CASE 
                        WHEN bTable.someColumn = 1 THEN someValue1 
                        WHEN bTable.someColumn = 2 THEN someValue2 
                        ELSE someValue3
                    END  
                FROM         
                    bTable
                WHERE
                    bTable = @someCriteria
                ORDER BY
                    someSortColumn
            ) AS B(Value)
WHERE            
  A.id = @someId;

Разница между моим ответом и ответом gbn заключается в том, что здесь столбец aColumn не изменяется. Я думаю, что isnull(..., aColumn) на самом деле обновляет значение, поэтому , если у вас есть триггер обновления, он сработает.

1 голос
/ 17 июня 2011
UPDATE aTable
SET aColumn = s.Value
FROM (   
    SELECT TOP 1    
        CASE 
            WHEN bTable.someColumn = 1 THEN someValue1 
            WHEN bTable.someColumn = 2 THEN someValue2 
            ELSE someValue3
        END AS Value
    FROM         
        bTable
    WHERE
        bTable = @someCriteria
    ORDER BY
        someSortColumn
) s
WHERE aTable.id = @someId
  AND s.Value IS NOT NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...