如果值包含某个字符,则执行此操作,否则执行此操作

时间:2013-07-31 14:56:29

标签: sql sql-server function if-statement substring

我正在尝试编写一个处理列值的函数,并在“@”符号之前返回值。

到目前为止,我已使用以下代码设法完成此操作:

Create Function fnStaffCodeConvert (@staffcode varchar(10))
Returns varchar(4)
AS
BEGIN
    DECLARE     @staffinitals varchar(4)
    SET @staffinitals = (SELECT substring(@staffcode,0, CHARINDEX('@',@staffcode)))
    Return @staffinitials
END

函数的示例结果 - 参数in = ABC@123,返回= ABC

这可以工作,但后来只返回列中包含@值的每个结果,并且省略了没有@的其余结果。即ABC@123会返回ABC,但XYZ不会返回任何内容。

如何修改代码以给我两组值?我想我必须在那里放一个'IF'语句,但我不确定如何写它来得到我想要的结果。

非常感谢提前:)

麦克

2 个答案:

答案 0 :(得分:0)

你快到了:

ALTER FUNCTION fnStaffCodeConvert (@staffcode varchar(10))
RETURNS VARCHAR(4)
AS
BEGIN
   DECLARE @staffinitals AS VARCHAR(4)
   if CHARINDEX('@',@staffcode) <> 0    
     SET @staffinitals = (SELECT substring(@staffcode,0, CHARINDEX('@',@staffcode)))
   Else 
   SET @staffinitals = @staffcode   

   RETURN @staffinitals
END

答案 1 :(得分:0)

您可以使用case

执行所需操作
Create Function fnStaffCodeConvert (@staffcode varchar(10))
Returns varchar(4);
AS
BEGIN
    DECLARE     @staffinitals varchar(4);
    SET @staffinitals = (SELECT (case when @staffcode like '%@%'
                                      then substring(@staffcode,0, CHARINDEX('@',@staffcode)
                                      else @staffcode
                                  end));
    Return @staffinitials;
END

但是等等,你可以进一步简化:

Create Function fnStaffCodeConvert (@staffcode varchar(10))
Returns varchar(4)
AS
BEGIN
    DECLARE @staffinitals varchar(4)
    SELECT @staffinitials = (case when @staffcode like '%@%'
                                  then substring(@staffcode,0, CHARINDEX('@',@staffcode)
                                  else @staffcode
                             end);
    Return @staffinitials;
END;