1

我有以下 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

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

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

4

1 回答 1

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'
于 2013-02-05T10:50:35.497 回答