I'm using this in a SQL query in SQL Server Management Studio, so that if the column dbo.Material_Trans.Lot has a dash the dash and all the string to the right is removed.
SUBSTRING(dbo.Material_Trans.Lot, 0, CHARINDEX('-', dbo.Material_Trans.Lot))
However, if the dbo.Material_Trans.Lot column does not contain a '-', then it returns nothing. I would like an IIF statement that if the dbo.Material_Trans.Lot does not contain a '-' return the dbo.Material_Trans.Lot column, else do the
SUBSTRING(dbo.Material_Trans.Lot, 0, CHARINDEX('-', dbo.Material_Trans.Lot))
Thank you!
I have tried the IIF and it fails within SQL as invalid statement.
CodePudding user response:
You can create a unique constraint over a generated column. For example:
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
Result:
a clean_data
------------ ----------
Hello-World Hello
Theremin Theremin
-123
Happy Happy
See running example at db<>fiddle.
CodePudding user response:
You should generally prefer CASE expressions over IIF() as IIF() is not part of the ansi standard. But COALESCE() NULLIF() can also work here and may be more efficient:
SUBSTRING(dbo.Material_Trans.Lot, 0,
COALESCE(NULLIF(CHARINDEX('-', dbo.Material_Trans.Lot),0),LEN(dbo.Material_Trans.Lot))
)
The CASE expression would look like this:
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
