如何使用案例在SQL中有条件地分配值

Koj*_*nte 1 sql t-sql sql-server plsql

我想根据一系列条件为变量赋值。我可以使用IF / ELSE来执行此操作,如以下代码所示:

DECLARE @param1 VARCHAR(100) = 'value1';
DECLARE @param2 AS Varchar (25) = 'value2';
DECLARE @param3 AS Varchar (25) = 'value3';
DECLARE @param4 AS Varchar(25) = 'value4';

SELECT @param1 = @param1 + '_' + @param2;
BEGIN
    IF LEN(@param3) > 0 AND LEN(@param4) > 0
       SELECT @param1= @param1+ '_' + @param3 + '_' + @param4;
    ELSE
    IF LEN(@param3) > 0
       SELECT @param1= @param1+ '_' + @param3;
    ELSE IF LEN(@param4) > 0
    SELECT @param1= @param1 + '_' + @param4;
END
Run Code Online (Sandbox Code Playgroud)

我想用CASE,WHEN / THEN替换IF / ELSE。就像是:

SELECT CASE 
    WHEN LEN(@param3) > 0 AND LEN(@param4) > 0 THEN  
        @param1 = @param1 + '_' + @param2 + '_' + @param3 + '_' + @param4
    WHEN LEN(@param3) > 0 AND LEN(@param4) <= 0 THEN  
        @param1 = @param1 + '_' + @param2 + '_' + @param3
    WHEN LEN(@param3) <= 0 AND LEN(@param4) > 0 THEN 
        @param1 = @param1 + '_' + @param2 + '_' + @param4
    ELSE @param1 = @param1 + '_' + @param2
Run Code Online (Sandbox Code Playgroud)

Dav*_*ois 5

CASE子句是一个返回值的表达式。因此,您无法从中进行分配CASE。但是您可以将的结果分配给CASE变量。

SELECT @param1 = CASE 
    WHEN LEN(@param3) > 0 AND LEN(@param4) > 0 THEN  
        @param1 + '_' + @param2 + '_' + @param3 + '_' + @param4
    WHEN LEN(@param3) > 0 AND LEN(@param4) <= 0 THEN  
        @param1 + '_' + @param2 + '_' + @param3
    WHEN LEN(@param3) <= 0 AND LEN(@param4) > 0 THEN 
        @param1 + '_' + @param2 + '_' + @param4
    ELSE 
        @param1 + '_' + @param2
    END
Run Code Online (Sandbox Code Playgroud)