2017-02-16 81 views
0

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

Declare @Forename Varchar(50) 

Set @Forename = 'John' 

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

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

在此先感谢

回答

1

按照文档:

,则返回null参数中的任何一个为NULL。

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

编辑:

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

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

在这里,您可以与附加的 “分隔符” 字延长'%[/]%'

+0

我们走了,我没有完全理解。我应该更多地关注BOL。感谢您为我指出 –

+0

一个案例陈述应该做的伎俩,谢谢先生。接受答案 –

2

NULL在几乎任何操作返回NULL,这样的结果并不奇怪。可能是你在SQL Server中想要什么的最简单方法是:

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

charindex()发现/如果有的话 - 的+ '/'确保找到一个斜线。 left()然后选择以前的所有字符。

+0

这是一个很好的解决方案,但如果我有多个巢?如:替换(替换(替换(@Forename,'/',NULL),'或',NULL),'和',NULL) –

0

您必须在SQL中创建自定义拆分方法,该方法将按'/'分隔符拆分您的名称字符串。如果你的@Forename字符串中有'/'。

下面是拆分方法示例代码:

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,'/') 
+0

感谢您的回答,但我认为实现验证检查有更容易和更少的资源密集型方法/尤其是因为这只是针对1个特殊字符,实际上有几个。但是,再次感谢输入 –