需要有关SQL Server中正则表达式的帮助

时间:2016-08-02 15:06:52

标签: sql-server regex

我正在尝试使用SQL Server修剪某个单词。例如:我有一张包含以下数据的表格:

Column1  | Column2
---------+-----------------
Test1    | ABC->IT->CDE
Test2    | ABCD->OT->FGH

我试图将输出设为:

Column1 | Column2
--------+----------
Test1   |  CDE
Test2   |  FGH

即。试图修剪直到第二个箭头“ - >”并在此之后只显示单词。我尝试过使用东西和charindex。

case 
   when Column2 like '%->%' 
      then stuff(Column2, 1, charindex('%[A-Z]%->%[A-Z]%->',Column2),'')   
      else null 
end as Test

不确定这是否有效。你能帮我解决这个问题。

提前致谢。

4 个答案:

答案 0 :(得分:0)

这可以让你分手。

SELECT 
   Column1,
   REVERSE(LEFT(reverse(Column2), charindex('>', reverse(Column2)) - 1)) as Column2
FROM Table1

答案 1 :(得分:0)

这个怎么样?

DECLARE @t as Varchar(255) = 'ABC->IT->CDE'

select REVERSE(SUBSTRING(REVERSE(@t), 0, CHARINDEX(REVERSE('->'), REVERSE(@t))))

其中@t是你的专栏

答案 2 :(得分:0)

虽然不是绝对必要,但我建议保留用于在用户定义的函数中解析字符串的逻辑。如果需要改进或更新字符串解析逻辑,只需更新函数而不更改其余查询。

根据您的描述,您需要字符串的第3个字或字符串中的最后一个字。我假设您想要第3个单词,并且字符串中的单词数可以是可变的。以下函数应返回您想要的内容。

CREATE FUNCTION GetThirdWord 
(
    @inputString    VARCHAR(200),
    @delimitor      VARCHAR(10)
)
RETURNS VARCHAR(200)
AS
BEGIN

    DECLARE @result NVARCHAR(50);
    DECLARE @delimitorLength INT = LEN(@delimitor);

    DECLARE @firstDelimitor INT = charindex('->', @inputString);
    DECLARE @secondDelimitor INT = charindex('->', @inputString, @firstDelimitor + @delimitorLength);
    DECLARE @thirdDelimitor INT = charindex('->', @inputString, @secondDelimitor + @delimitorLength);

    IF @secondDelimitor > 0 
    BEGIN

        IF @thirdDelimitor = 0 
            SET @thirdDelimitor = LEN(@inputString);

        SET @result = SUBSTRING(@inputString, @secondDelimitor + @delimitorLength, @thirdDelimitor - @secondDelimitor - @delimitorLength)

    END

    RETURN @result;

END

可以按以下方式调用该函数:

SELECT  Column1,
        dbo.GetThirdWord(Column2, '->') AS Column2
FROM    YourTableName

答案 3 :(得分:0)

您还没有给我足够的信息以确保这样做有效,但如果您尝试执行此操作的行的格式始终相同,则可以非常轻松地执行以下操作:

select right(Column2,3)
into #NewColumn
from YourTable
where YourConditionsHere

没有必要的正则表达式