我在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
?
答案 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 强>