0

こんにちは私はSQLを初めて使用し、Caseステートメントを使用したいと思います。

私は現在このSQLステートメントを持っています

update tblAccount set FullName = rtrim(isnull(FirstName,''));
update tblAccount set FullName = FullName + ' ' + rtrim(MI)
where substring(reverse(MI),1,1)='.';
update tblAccount set FullName = FullName + ' ' + rtrim(MI) + '.'
where substring(reverse(MI),1,1)!='.'
and MI is not null and len(rtrim(MI)) = 1;
update tblAccount set FullName = FullName + ' ' + rtrim(MI) 
where len(rtrim(MI)) >= 2;
update tblAccount set FullName = FullName + ' ' + LastName;
update tblAccount set FullName = FullName + ', ' + Suffix 
where Suffix is not null
and len(rtrim(Suffix)) > 0;

これをもっと小さくて読みやすいものに変換したいのですが、Caseステートメントが役立つかもしれないと言われましたが、私はそれに精通しています。誰かがこれをもっと読みやすいものに変換するのを手伝ってくれるかどうか疑問に思いました。

4

3 に答える 3

2

1 つのステートメントにすることもできますが、コードで同じ列を再変更するため、関数呼び出しをネストして結合する必要があり、非常に巨大なステートメントになり、現在のコードよりもはるかに読みにくくなります。

また、実行の順序も重要であるため、単一のステートメントを維持およびデバッグすることははるかに困難になります。

そのままにしておいてください。あなたが持っているものは良いです。


パフォーマンスに関しては、コードのメンテナンスと明快さが毎回パフォーマンスを上回っていると言えます (パフォーマンスが「許容範囲内」である限り)。

とはいえ、現在の呼び出しにはそれぞれ完全なテーブル スキャンが必要ですが、1 つのステートメントでは 1 つしか必要ありません。ただし、テーブルのサイズによっては、最初のスキャン後にテーブルがメモリにキャッシュされ、単一のステートメントが非常に複雑になり、実際には現在のコードよりも遅くなる場合があります。

テストする必要がありますが、問題がない限りパフォーマンスを考慮すべきではありません。コードを早期に最適化しないでください。

于 2012-06-14T18:41:34.767 に答える
1

@Bohemianが言ったように、パフォーマンスを少しアップグレードするだけで、このように書き直します。

--MIDDLE NAME?
    update tblAccount 
    set FullName = 
                    case when  substring(reverse(MI),1,1)='.' THEN --  FIRST + SECOND UPDATE
                        rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI)
                    case when substring(reverse(MI),1,1)!='.' and MI is not null and len(rtrim(MI)) = 1 THEN --FIRST AND THIRD UPDATE
                        rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI) + '.'
                    else  -- FIRST UPDATE
                         rtrim(isnull(FirstName,''));
                    end 

    GO      
    -- LASTNAME     
    update tblAccount 
    set FullName = case when len(rtrim(MI)) >= 2 THEN
                        (FullName + ' ' + rtrim(MI)) + ' ' + LastName
                    else
                        FullName + ' ' + LastName;
                    END
    GO

    -- SUFFIX
    update tblAccount 
    set FullName = FullName + ', ' + Suffix 
    where Suffix is not null
    and len(rtrim(Suffix)) > 0;
于 2012-06-14T19:05:48.110 に答える
0

一般的な形式は

CASE WHEN <condition> THEN <value> ELSE <somethingElse> END

WHEN <condition> THEN <value>繰り返すことができ、ELSE <somethingElse>オプションの場所

caseステートメントは、ストアドプロシージャやスクリプトのように制御構造として使用することも、。のようにインラインで使用することもできますSELECT

updateステートメントはこれと同等です。

UPDATE tblAccount SET FullName = 
    rtrim(isnull(FirstName,''))
    + CASE 
        WHEN substring(reverse(MI),1,1)='.' THEN ' ' + RTRIM(MI)  
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
        WHEN MI is not null and len(rtrim(MI)) = 1 THEN rtrim(MI) + '.'
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
        ELSE
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
    END
    + ' ' + LastName
    + CASE 
        WHEN Suffix IS NOT NULL AND len(rtrim(Suffix)) > 0 THEN ', '+Suffix 
    END

6つの更新がありました。nrs1、5、および6は単純で、上記の1つのステートメントにほとんどコピーされています。2によるレコードの更新は、3による影響を受けず、4は2、3、またはどちらでも発生しない可能性があります(コードによると、データは別の方法で証明される場合があります)。したがって、4が繰り返されます。


当然のことながら、私はあなたの発言がうまくいくという論文に心から反対します。必要なのが1回の更新である場合は、1回の更新を実行します。そして、無回答を受け入れることによって圧力に屈しないでください。

楽しむ!

学習中は、COALESCE()もご覧ください。

于 2012-06-14T18:47:32.237 に答える