【问题标题】:Update a field with a cascaded string, depending on other fields使用级联字符串更新字段,具体取决于其他字段
【发布时间】:2013-02-05 10:28:53
【问题描述】:

我有以下 SQL 查询(简化):

UPDATE myTable
SET Phone1 = 049
    ,Phone2 = 123
    ,Class = --???
WHERE Project = 'ABC'

所以我只想为每个项目“ABC”设置一些默认值。对于 Class 字段,我想要以下内容:表中有 5 个其他字段,Class1 到 Class5,每个字段包含 1 或 0。如果 Class1 为 1,则 Class 应包含“C1”。如果 Class1 和 Class3 包含 1,则 Class 应为“C1 + C3”。如果所有 ClassN 字段都包含 1,则应该是“C1 + C2 + C3 + C4 + C5”等等。

现在这也不太难:

DECLARE @Class NVARCHAR(100)
DECLARE @Class1 INT = 0
DECLARE @Class2 INT = 0
DECLARE @Class3 INT = 0
DECLARE @Class4 INT = 0
DECLARE @Class5 INT = 0

SET @Class = CASE 
        WHEN ISNULL(@Class1, 0) = 1
            THEN 'C1 + '
        ELSE ''
        END
SET @Class = ISNULL(@Class, '') + CASE 
        WHEN ISNULL(@Class2, 0) = 1
            THEN 'C2 + '
        ELSE ''
        END
SET @Class = ISNULL(@Class, '') + CASE 
        WHEN ISNULL(@Class3, 0) = 1
            THEN 'C3 + '
        ELSE ''
        END
SET @Class = ISNULL(@Class, '') + CASE 
        WHEN ISNULL(@Class4, 0) = 1
            THEN 'C4 + '
        ELSE ''
        END
SET @Class = ISNULL(@Class, '') + CASE 
        WHEN ISNULL(@Class5, 0) = 1
            THEN 'C5 + '
        ELSE ''
        END

-- Remove last +
IF (LEN(@Class) > 0)
    SET @Class = LEFT(ISNULL(@Class, ''), LEN(@Class) - 2)

SELECT @Class

但现在我只是不确定如何以最好的方式将这两件事结合起来。我怎样才能以最好的方式将它们结合起来?

我现在最好的想法是创建一个标量值函数并返回字符串。

【问题讨论】:

    标签: tsql sql-update sql-server-2012


    【解决方案1】:

    这个怎么样?

    UPDATE myTable
    SET Phone1 = 049
        ,Phone2 = 123
        ,Class = 
    CASE WHEN 1 IN (Class1, Class2, Class3, Class4, Class5) THEN
    LEFT(
    CONCAT(
    CASE WHEN ISNULL(Class1, 0) = 1 THEN 'C1 + ' ELSE '' END,
    CASE WHEN ISNULL(Class2, 0) = 1 THEN 'C2 + ' ELSE '' END,
    CASE WHEN ISNULL(Class3, 0) = 1 THEN 'C3 + ' ELSE '' END,
    CASE WHEN ISNULL(Class4, 0) = 1 THEN 'C4 + ' ELSE '' END,
    CASE WHEN ISNULL(Class5, 0) = 1 THEN 'C5 + ' ELSE '' END
    )
    , LEN(
    CONCAT(
    CASE WHEN ISNULL(Class1, 0) = 1 THEN 'C1 + ' ELSE '' END,
    CASE WHEN ISNULL(Class2, 0) = 1 THEN 'C2 + ' ELSE '' END,
    CASE WHEN ISNULL(Class3, 0) = 1 THEN 'C3 + ' ELSE '' END,
    CASE WHEN ISNULL(Class4, 0) = 1 THEN 'C4 + ' ELSE '' END,
    CASE WHEN ISNULL(Class5, 0) = 1 THEN 'C5 + ' ELSE '' END
    )
    ) - 2)
    ELSE '' END 
    WHERE Project = 'ABC'
    

    【讨论】:

    • @Feroc 不要担心有两次相同的CONCAT 块,它只会执行一次。优化器做得很好。有什么反馈吗?
    • 谢谢,应该很好用。现在我只是在想一个函数是否是更清洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2021-09-21
    • 2016-12-28
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多