如何处理空字符串,就像你可以使用isnull()null?

时间:2014-08-11 05:30:54

标签: sql-server-2008 sql-server-2012

我在SQL Server中解析字符串时遇到小问题。

我有一张这样的表:

emp

sn | code      | sal
1  | 1100F-    | 100
2  |           | 200
3  | 97535-GO  | 300
4  | 97530-GO  | 300
5  |           | 600
6  | 9830      |200

根据此表数据,我想输出如下结果:

sn | code     | Changed  | sal
1  | 1100F    | NA       | 100
2  | 0        | NA       | 200
3  | 97535    | GO       | 300
4  | 97530    | GO       |300
5  | 0        | NA       |600
6  |9830      | NA       |200

“已更改”列应包含-后代码列中的所有内容,-之后没有任何内容,或者-之后没有任何内容,我应该使用NA

我目前的代码是:

select 
   sn,
   code,
   sal case WHEN CHARINDEX('-',code)>0  
     THEN SUBSTRING(code,CHARINDEX('-',code)+1,len(code)) 
     ELSE 'NA' END changed
from emp 

我遇到的问题是,对于第一行,我得到一个空字符串而不是NA,有人可以帮助更改它,以便如果有-没有代码,那么显示NA

2 个答案:

答案 0 :(得分:0)

这可以满足您的需求,但由于重复,我对此并不满意:

select 
sn,
case when charindex('-', code) > 0
    then 
        case substring(code, charindex('-', code) + 1, len(code))
        when '' then 'NA'
        else substring(code, charindex('-', code) + 1, len(code))
        end
    else 'NA'
    end
from emp

但额外的嵌套案例将确保空代码具有“NA”。

为此定义一个标量值函数并使用一些变量可能更有意义,如下所示:

create function GetChanged(@code varchar(10)) returns varchar(10)
as
begin 
    declare @result varchar(10) = 'NA';
    declare @dashIndex int = charindex('-', @code);
    if (@dashIndex > 0)
    begin
        declare @changed varchar(10) = substring(@code, @dashIndex + 1, len(@code))
        if (@changed != '')
            set @result = @changed;
    end;

    return @result;
end;

答案 1 :(得分:0)

SELECT sn,
    CASE WHEN ISNULL((CASE WHEN CHARINDEX('-',code)>0 THEN SUBSTRING(code,1,CHARINDEX('-',code,1)-1) ELSE code END),'')='' THEN '0'
        ELSE CASE WHEN CHARINDEX('-',code)>0 THEN SUBSTRING(code,1,CHARINDEX('-',code,1)-1) ELSE code END
    END AS Code,
    CASE (CASE WHEN CHARINDEX('-',code)>0 THEN SUBSTRING(code,CHARINDEX('-',code,1)+1,LEN(code)) ELSE 'NA' END)
        WHEN '' THEN 'NA'
        ELSE CASE WHEN CHARINDEX('-',code)>0 THEN SUBSTRING(code,CHARINDEX('-',code,1)+1,LEN(code)) ELSE 'NA' END
    END AS changed,
    sal
FROM EMP 

<强> SQl Fiddle