Sql server 2008 如何处理空字符串,就像使用isnull()可以为空一样?

Sql server 2008 如何处理空字符串,就像使用isnull()可以为空一样?,sql-server-2008,sql-server-2012,Sql Server 2008,Sql Server 2012,我在SQL Server中解析字符串时遇到了小问题 我有一张这样的桌子: 电磁脉冲 基于此表数据,我想输出如下结果: 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 |983

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

我有一张这样的桌子:

电磁脉冲

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

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
更改后的列应该包含-,后面的code列中的所有内容,在-,后面没有任何内容,或者没有-,我应该使用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?

这正是您想要的,但我不完全满意,因为重复:

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;
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;
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