sql >> データベース >  >> RDS >> Sqlserver

この CASE 式はどのようにして ELSE 句に到達しますか?

    WHEN 句ごとに新しい「乱数」が計算されます - 代わりに派生テーブルを使用できます:

    SELECT ID, Name, 
        Channel = 
          CASE Rand
            WHEN 0 THEN 'Baby Only'
            WHEN 1 THEN 'Club'
            WHEN 2 THEN 'Drug'
            WHEN 3 THEN 'Food'
            WHEN 4 THEN 'Internet'
            WHEN 5 THEN 'Liquidators'
            WHEN 6 THEN 'Mass'
            WHEN 7 THEN 'Military'
            WHEN 8 THEN 'Other'
            WHEN 9 THEN 'Speciality'
            ELSE '*NONE*'            -- How is this ever getting reached?
          END
    FROM
    (   SELECT 
             id,
             name,
             ABS(CHECKSUM(NewId())) % 10 Rand
        FROM   
            retailshelf_nil...account A
    ) zzz;
      

    または CROSS APPLY サブクエリ:

    SELECT A.ID, A.Name, 
        Channel = 
          CASE zzz.Rand
            WHEN 0 THEN 'Baby Only'
            WHEN 1 THEN 'Club'
            WHEN 2 THEN 'Drug'
            WHEN 3 THEN 'Food'
            WHEN 4 THEN 'Internet'
            WHEN 5 THEN 'Liquidators'
            WHEN 6 THEN 'Mass'
            WHEN 7 THEN 'Military'
            WHEN 8 THEN 'Other'
            WHEN 9 THEN 'Speciality'
            ELSE '*NONE*'            -- How is this ever getting reached?
          END
    FROM
        retailshelf_nil...account A
    CROSS APPLY
    (   SELECT 
            ABS(CHECKSUM(NewId())) % 10
    ) zzz (Rand);
      

    その方法 NewID() レコードごとに 1 回だけ呼び出されます。

    同様のシナリオが解決されました こちら .

    T-SQL ドキュメント この現象を説明しています (Sybase の場合ですが、SQL Server にも当てはまるようです):



    1. cakephp検索クエリの同じテーブルでSQLユニオンを使用する

    2. MYSQLでコメント応答クエリを作成するにはどうすればよいですか?

    3. CentOS7にMariaDBをインストールして保護する方法

    4. PerconaXtraDBクラスターのProxySQLを使用した負荷分散