0

列の値を処理し、'@' 記号の前のすべての値を返す関数を作成しようとしています。

次のコードを使用して、これまでのところこれを行うことができました。

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

関数の結果の例 - = のパラメータ、 =ABC@123を返しますABC

これは機能しますが、列に値が含まれているすべての結果を排他的に返し、@値のない残りの結果@は省略されます。つまり、返されますが、何もABC@123返されません。ABCXYZ

コードを修正して、両方の値のセットを取得するにはどうすればよいですか? そこに「IF」ステートメントを入れる必要があると思いますが、必要な結果を得るためにそれを書く方法がわかりません。

よろしくお願いします:)

マイク

4

2 に答える 2

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
于 2013-07-31T15:41:25.780 に答える
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;
于 2013-07-31T15:41:51.137 に答える