SQL限制数字限制破折号和字符到右边,但如果没有破折号仍然显示字段数据



我在SQL Server管理工作室的SQL查询中使用这个,这样,如果列dbo.Material_Trans.Lot有一个破折号,破折号和所有的字符串到右边被删除。

SUBSTRING(dbo.Material_Trans.Lot, 0, CHARINDEX('-', dbo.Material_Trans.Lot))

但是,如果dbo.Material_Trans.Lot列不包含'-',则不返回任何值。我想要一个IIF声明,如果dbo.Material_Trans.Lot不包含'-'返回dbo.Material_Trans.Lot列,否则执行

SUBSTRING(dbo.Material_Trans.Lot, 0, CHARINDEX('-', dbo.Material_Trans.Lot))

谢谢!

我已经尝试了IIF,它在SQL中作为无效语句失败。

可以在生成的列上创建唯一约束。例如:

create table t (a varchar(20));
insert into t (a) values ('Hello-World'), ('Theremin'), ('-123');
alter table t add clean_data as case when charindex('-', a) = 0 
then a
else substring(a, 0, charindex('-', a) ) 
end;
alter table t add constraint uq_clean_data unique (clean_data);
insert into t (a) values ('Happy'); -- Succeeds
insert into t (a) values ('Hello-Tom'); -- Fails as expected

结果:

a            clean_data 
------------ ---------- 
Hello-World  Hello      
Theremin     Theremin   
-123                    
Happy        Happy      

参见运行示例:db<>fiddle。

您通常应该选择CASE表达式而不是IIF(),因为IIF()不是ansi标准的一部分。但是COALESCE()+NULLIF()也可以在这里工作,并且可能更有效:

SUBSTRING(dbo.Material_Trans.Lot, 0,    
COALESCE(NULLIF(CHARINDEX('-', dbo.Material_Trans.Lot),0),LEN(dbo.Material_Trans.Lot)) 
)

CASE表达式看起来像这样:

CASE WHEN CHARINDEX('-', dbo.Material_Trans.Lot) > 0 THEN
SUBSTRING(dbo.Material_Trans.Lot, 0, CHARINDEX('-', dbo.Material_Trans.Lot))  
ELSE dbo.Material_Trans.Lot END

相关内容

  • 没有找到相关文章

最新更新