SQL Server SQL限制数字将短划线和字符限制在右侧,但如果没有短划线,则仍显示字段数据

gzjq41n4  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(174)

我在SQL Server Management Studio中的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中作为无效语句失败。

bvuwiixz

bvuwiixz1#

可以对生成的列创建唯一约束条件。例如:

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中的运行示例。

vojdkbi0

vojdkbi02#

一般来说,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

相关问题