SQL替换函数和NULLS

时间:2017-02-16 14:28:06

标签: sql sql-server

这应该很简单,但我可以为我的生活找到答案。基本上我有一个更新数据库的存储过程。在数据库中,我有forename和surname列,存储过程正在执行业务逻辑。我想要做的是,如果有人试图输入多个名称,它会根据一系列替换语句识别出来,如果找到任何名称则返回NULL,例如在下面的代码中它正在寻找“/”(好像它正在寻找像John / Jill这样的人,就像下面的示例代码一样:

Declare @Forename Varchar(50)

Set @Forename = 'John'

Select Replace(@Forename,'/',NULL)

然而,即使没有/存在,它也不会重新调整'John'而返回NULL。我有一个谷歌,但我找不到任何东西。当然在我的真实代码中有许多嵌套的替换语句,但这只是为了向您展示我遇到的问题。任何帮助都会很棒。

提前致谢

3 个答案:

答案 0 :(得分:2)

几乎所有操作中的

NULL都返回NULL,因此结果并不令人惊讶。在SQL Server中执行所需操作的最简单方法可能是:

Select left(@Forename, charindex('/', @Forename + '/') - 1)

charindex()找到/(如果有) - + '/'确保找到斜杠。 left()然后选择所有字符,直到之前的字符。

答案 1 :(得分:1)

根据文件:

  

如果任何一个参数为NULL,则返回NULL。

https://msdn.microsoft.com/en-us/library/ms186862.aspx

编辑:

如果我理解你的原始要求,你需要这样的东西:

select case when @forename like '%[/]%' then null else @forename end

在这里,您可以使用额外的"分隔符"扩展'%[/]%'。字符。

答案 2 :(得分:0)

您必须在SQL中创建自定义Split方法,它将使用'/'分隔符拆分您的名称字符串。如果您的@Forename字符串中包含“/”。

以下是Split方法的示例代码:

CREATE FUNCTION [dbo].[SplitString] 
( 
    @string NVARCHAR(MAX),
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END
GO

用法:

Select * from dbo.SplitString(@Forename,'/')