带参数的CASE语句构造

1 sql t-sql sql-server case

有人可以告诉我,以下施工有什么问题?:

 CASE @CountryID
        WHEN 1 THEN SET @String = REPLACE(@String,'+420','')
        WHEN 2 THEN SET @String = REPLACE(@String,'+421','')    
        WHEN 3 THEN SET @String = REPLACE(@String,'+359','')    
        WHEN 4 THEN SET @String = REPLACE(@String,'+7','')  
        WHEN 5 THEN SET @String = REPLACE(@String,'+48','') 
        WHEN 7 THEN SET @String = REPLACE(@String,'+63','') 
    END
Run Code Online (Sandbox Code Playgroud)

@CountryIDINT.

问题出现在CASE声明构造中,因为IF语句运行良好,但我看不到任何故障,尝试了不同类型的案例构建并搜索了文档.

任何提示都会很感激.

Luk*_*zda 5

你需要使用:

SELECT @String = 
CASE @CountryID
        WHEN 1 THEN REPLACE(@String,'+420','')
        WHEN 2 THEN REPLACE(@String,'+421','')    
        WHEN 3 THEN REPLACE(@String,'+359','')    
        WHEN 4 THEN REPLACE(@String,'+7','')  
        WHEN 5 THEN REPLACE(@String,'+48','') 
        WHEN 7 THEN REPLACE(@String,'+63','') 
        -- ELSE @String  -- to avoid NULL if no country found
    END;
Run Code Online (Sandbox Code Playgroud)

CASE is expression,但你用它CASE statement(例如在Oracle/DB2中可用)


Oracle支持两种CASE statement(不可用T-SQL):

CASE
    WHEN jobid = 'PU_CLERK' THEN sal_raise := .09;
    WHEN jobid = 'SH_CLERK' THEN sal_raise := .08;
    WHEN jobid = 'ST_CLERK' THEN sal_raise := .07;
    ELSE sal_raise := 0;
  END CASE;
Run Code Online (Sandbox Code Playgroud)

并且CASE expression:

 appraisal :=
      CASE grade
         WHEN 'A' THEN 'Excellent'
         WHEN 'B' THEN 'Very Good'
         WHEN 'C' THEN 'Good'
         WHEN 'D' THEN 'Fair'
         WHEN 'F' THEN 'Poor'
         ELSE 'No such grade'
      END;
Run Code Online (Sandbox Code Playgroud)

编辑:

正如HABO所提到的,你可以将它重写为:

SELECT @String = REPLACE(@String, 
    CASE @CountryID
            WHEN 1 THEN '+420'
            WHEN 2 THEN '+421' 
            WHEN 3 THEN '+359'  
            WHEN 4 THEN '+7'
            WHEN 5 THEN '+48'
            WHEN 7 THEN '+63'
            ELSE ''
        END, '');
Run Code Online (Sandbox Code Playgroud)

或者在SQL Server 2012及更高版本中,您可以使用CHOOSE:

SELECT @String = 
  REPLACE(@String, CHOOSE(CountryId,'+420','+421','+359','+7','+48', '+63'), '')
Run Code Online (Sandbox Code Playgroud)