1

次のSQLクエリがあります(簡略化):

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

したがって、すべてのプロジェクト「ABC」にいくつかのデフォルト値を設定したいだけです。クラスフィールドについては、次のものが必要です。テーブルには、Class1 から Class5 までの 5 つのフィールドがあり、各フィールドには 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

しかし今、私はこれら2つのことを最良の方法で組み合わせる方法がわかりません. どうすればそれらを最良の方法で組み合わせることができますか?

現在の私の最善のアイデアは、スカラー値関数を作成して文字列を返すことです。

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 に答える