1

我正在使用 SQL 并尝试在特殊字符(如<.

我用过这个 SQL:

SUBSTRING(ACTIVITY.Name, 0, CHARINDEX('<', ACTIVITY.Name, 2)) AS ActivityIdentifier

当列中有 a 时,它工作得非常好<,但是当一个不存在时,我没有得到任何结果。即使字符不存在,我也需要能够返回列值。

我查看了RTRIM,LEFTLEN函数,但由于我的Activity Name长度可能不同,它们似乎不合适。

我会很感激任何建议。

4

3 回答 3

0

我认为最简单的解决方法是将 a 附加'<'到字符串:

SUBSTRING(ACTIVITY.Name, 1, CHARINDEX('<', ACTIVITY.Name + '<', 2)) as ActivityIdentifier

如果你不想要'<'结果,那么:

SUBSTRING(ACTIVITY.Name, 1, CHARINDEX('<', ACTIVITY.Name + '<', 2) - 1) as ActivityIdentifier
于 2020-04-08T12:12:35.427 回答
0

您还可以编写一个存储函数来处理这个问题 - 因为它只是对传入的数据进行操作,而不是在后台进行任何“隐藏”数据访问,所以它在性能方面应该表现得相当好。

试试这个:

CREATE OR ALTER FUNCTION dbo.TrimSpecialChar
    (@Input NVARCHAR(500), @SpecialChar NCHAR(1))
RETURNS NVARCHAR(500)
AS
BEGIN
    DECLARE @Result NVARCHAR(500);

    -- if "special char" is not found - just return input
    DECLARE @SpecCharIx INT = CHARINDEX(@SpecialChar, @Input);

    IF (@SpecCharIx = 0)
        SET @Result = @Input;
    ELSE
        SET @Result = SUBSTRING(@Input, 1, @SpecCharIx-1);

    RETURN @Result;
END

然后你可以这样称呼它:

SELECT dbo.TrimSpecialChar(N'Testinput without special characters', N'<')

应该返回整个输入,而

SELECT dbo.TrimSpecialChar(N'Testinput with the < special characters', N'<')

只会回来

Testinput with the 
于 2020-04-08T12:23:37.823 回答
0

您可以简单地添加 case 表达式:

(case when charindex('<', ACTIVITY.Name) > 0
      then SUBSTRING(ACTIVITY.Name, 1, CHARINDEX('<', ACTIVITY.Name, 2))
      else ACTIVITY.Name
 end) as ActivityIdentifier
于 2020-04-08T12:26:27.837 回答