如何根据多个参数用不同的值更新sql中的多行

如何根据多个参数用不同的值更新sql中的多行,sql,sql-server,Sql,Sql Server,我希望根据几个具有不同值的参数更新多行。 我是什么意思?很高兴你这么问。 我的桌子现在看起来像这样: ------------- MyTable client_id api_id index msg_id settings 123 4 10 6 0 123 4 10 7 1 123 4 10 8 1 123

我希望根据几个具有不同值的参数更新多行。
我是什么意思?很高兴你这么问。
我的桌子现在看起来像这样:

-------------
MyTable
client_id    api_id    index  msg_id  settings
123          4         10     6       0
123          4         10     7       1
123          4         10     8       1
123          4         11     7       1
123          5         10     8       1
456          4         10     9       1
更改后我想要的表是:(仅更改设置列)

我现在想做的是:

UPDATE myTable SET settings = CASE client_id WHEN '123' THEN CASE api_id WHEN '4' THEN CASE index WHEN '10' THEN CASE msg_id WHEN '6' THEN 1 WHEN '7' THEN 2 WHEN '8' THEN 1 WHEN '9' THEN 0 ... END END END END 更新myTable集设置= 案例客户号 那么什么时候是"123"? 案件编号 那么什么时候是'4'呢 病例索引 那么什么时候是‘10’呢 案件编号 当“6”时,则为1 当‘7’然后是‘2’ 当'8'时,则为1 当'9'时,则为0 ... 结束 结束 结束 结束 我一直得到的例外是

无法在“设置”列、表“myTable”中插入空值;列不允许空值。更新失败

因此,我的问题是:

我问的可能吗

如果可能的话。我做错了什么


提前感谢。

您需要为每个
案例
表达式添加
ELSE
,并设置默认值(我猜是0):

或者更简单,正如他在评论中所建议的,只需用
ISNULL
将整个案例包装起来:

UPDATE myTable SET settings = 
ISNULL(CASE client_id
    WHEN '123' THEN
        CASE api_id
            WHEN '4' THEN
                CASE index
                    WHEN '10' THEN
                        CASE msg_id
                            WHEN '6' THEN 1
                            WHEN '7' THEN 2
                            WHEN '8' THEN 1
                            WHEN '9' THEN 0
                            ...
                        END
                END
        END
END, 0)

在您的情况下,如果中的client_id与'123'不同,则将设置为NULL,我认为您的列设置不应为NULL


如果在“123”时删除第一个
CASE client\u id
它可以正常工作

如果每个嵌套CASE表达式的默认值相同,您只需将最外层的CASE表达式用ISNULL包装即可。@SeanLange:您是对的,当然,我为什么没有考虑过它?@SeanLange您能给我一个示例吗?
UPDATE myTable SET settings = 
CASE client_id
    WHEN '123' THEN
        CASE api_id
            WHEN '4' THEN
                CASE index
                    WHEN '10' THEN
                        CASE msg_id
                            WHEN '6' THEN 1
                            WHEN '7' THEN 2
                            WHEN '8' THEN 1
                            WHEN '9' THEN 0
                            ...
                        ELSE 0
                        END
                    ELSE 0
                END
            ELSE 0
        END
    ELSE 0
END
UPDATE myTable SET settings = 
ISNULL(CASE client_id
    WHEN '123' THEN
        CASE api_id
            WHEN '4' THEN
                CASE index
                    WHEN '10' THEN
                        CASE msg_id
                            WHEN '6' THEN 1
                            WHEN '7' THEN 2
                            WHEN '8' THEN 1
                            WHEN '9' THEN 0
                            ...
                        END
                END
        END
END, 0)