我在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