SQL Server 2012:从字符串末尾删除文本

时间:2016-03-11 21:08:49

标签: sql sql-server stored-procedures

我是SQL的新手,所以如果我使用不正确的术语并且我的问题听起来很混乱,请原谅我。

我的任务是编写一个存储过程,它将作为字符串发送3个变量(我认为是varchar)。我需要取两个变量并从变量的末尾删除文本,并且只从结尾处删除。

我需要从变量末尾删除的字符串/文本是

  • CORP
  • 公司
  • 公司
  • LP
  • LLC
  • LTD
  • 限于

例如此字符串

  

Global Widgets LLC

会变成

  

全球小部件

然而,它应该只适用一次

  

Global Widgets Corporation LLC

应该成为

  

Global Widgets Corporation

然后我需要使用更改的变量来执行SQL查询。

这将用作我们拥有的集成件的备份,它可以调用另一个系统。另一个系统采用相同的变量,并使用Regex从变量末尾删除字符串。

我尝试过不同的PATINDEX,SUBSTRING,REPLACE,STUFF组合,但似乎无法找到能够胜任这项工作的东西。

=============================================== ================

编辑:我想感谢大家到目前为止所提供的答案,但我遗漏了一些我认为不重要的信息,但从答案来看,这似乎会影响处理。

我的proc将开始像

ALTER PROC [dbo].[USP_MyDatabaseTable] @variableToBeAltered nvarchar(50)
AS

然后我需要删除所有,.个字符。我已经知道如何做到这一点。然后我需要在@variableToBeAltered上进行处理(技术上会有两个变量)来删除我之前列出的字符串。然后我必须从@variableToBeAltered中删除所有空格。 (我再次认为那部分)。最后,我将在我的SQL查询中使用@variableToBeAltered,如

SELECT [field1] AS myField
    ,[field2] AS myOtherField
FROM [MyData].[dbo].[MyDatabaseTable] 
WHERE [field1] = (@variableToBeAltered);

我希望这些信息更有用。

4 个答案:

答案 0 :(得分:4)

我将所有后缀保存在表格中,以使其更容易一些。然后,您可以在查询中或针对变量执行此类代码。

DECLARE @company_name VARCHAR(50) = 'Global Widgets Corporation LLC'

DECLARE @Suffixes TABLE (suffix VARCHAR(20))
INSERT INTO @Suffixes (suffix) VALUES ('LLC'), ('CO'), ('CORP'), ('CORPORATION'), ('COMPANY'), ('LP'), ('LTD'), ('LIMITED')

SELECT @company_name = SUBSTRING(@company_name, 1, LEN(@company_name) - LEN(suffix))
FROM @Suffixes
WHERE @company_name LIKE '%' + suffix

SELECT @company_name

这里的关键是你只匹配以后缀结尾的字符串,它使用SUBSTRING而不是REPLACE来避免意外地从字符串中间删除任何后缀的副本

这里的@Suffixes表是一个表变量,但是你创建它并将其作为永久表填充更有意义。

查询只会找到与其后缀匹配的一行(如果有)和字符串的结尾。如果找到匹配,那么该变量将被设置为子串,其末尾的长度从末尾移除。通常会有一个尾随空格,但对于VARCHAR只会被删除。

但是仍有一些潜在的问题需要注意......

首先,如果你的公司名称是" Watco"那么" co"在这里会是误报。我不确定除了可能使你的后缀包括一个领先的空间之外还可以做些什么。

其次,如果一个后缀以您的其他后缀结尾,那么它们应用的顺序可能是个问题。你可以通过仅应用suffix长度最大的行来解决这个问题,但它会变得更加复杂,所以我现在已经把它留了下来。

答案 1 :(得分:1)

您可以使用如下查询:

-- Assuming that you can maintain all patterns in a table or a temp table
CREATE TABLE tbl(pattern varchar(100))
INSERT INTO tbl values
('co'),('llc'),('beta')

--@a stores the string you need to manipulate, @lw & @b are variables to aid
DECLARE @a nvarchar(100), @b nvarchar(100), @lw varchar(100)
SET @a='alpha beta gamma'
SET @b=''

-- @t is a flag 
DECLARE @t int
SET @t=0

-- Below is a loop
WHILE(@t=0 OR LEN(@a)=0 )
  BEGIN
    -- Store the current last word in the @lw variable
    SET @lw=reverse(substring(reverse(@a),1, charindex(' ', reverse(@a)) -1)) 

    -- check if the word is in pattern dictionary. If yes, then Voila!
    SELECT @t=1 FROM tbl WHERE @lw like pattern

    -- remove the last word from @a
    SET @a=LEFT(@a,LEN(@a)-LEN(@lw))

    IF (@t<>1) 
     BEGIN
      -- all words which were not pattern are joined back onto this stack
       SET @b=CONCAT(@lw,@b)
     END
  END

-- get back the remaining word
SET @a=CONCAT(@a,@b)
SELECT @a
drop table tbl

请注意,此方法克服了Tom的

问题
  

如果您的公司名称类似于&#34; Watco&#34;那么&#34; co&#34;在这里会是误报。我不确定除了可能使你的后缀包括一个领先的空间之外还可以做些什么。

答案 2 :(得分:1)

以Tom H给出的答案为基础,但在整个表格中应用:

set nocount on;
declare @suffixes table(tag nvarchar(20));
insert into @suffixes values('co');
insert into @suffixes values('corp');
insert into @suffixes values('corporation');
insert into @suffixes values('company');
insert into @suffixes values('lp');
insert into @suffixes values('llc');
insert into @suffixes values('ltd');
insert into @suffixes values('limited');

declare @companynames table(entry nvarchar(100),processed bit default 0);
insert into @companynames values('somecompany llc',0);
insert into @companynames values('business2 co',0);
insert into @companynames values('business3',0);
insert into @companynames values('business4 lpx',0);

while exists(select * from @companynames where processed = 0)
begin
  declare @currentcompanyname nvarchar(100) = (select top 1 entry from @companynames where processed = 0);
  update @companynames set processed = 1 where entry = @currentcompanyname;
  update @companynames
  set entry = SUBSTRING(entry, 1, LEN(entry) - LEN(tag))
  from @suffixes
  where entry like '%' + tag
end
select * from @companynames

答案 3 :(得分:0)

在SQL 2012中使用replace函数,

declare @var1 nvarchar(20) = 'ACME LLC' 
declare @var2 nvarchar(20) = 'LLC' 

SELECT CASE 
            WHEN ((PATINDEX('%'+@var2+'%',@var1) <= (LEN(@var1)-LEN(@var2))) 
                Or (SUBSTRING(@var1,PATINDEX('%'+@var2+'%',@var1)-1,1) <> SPACE(1))) 
                THEN @var1 
            ELSE 
                REPLACE(@var1,@var2,'') 
            END

这是克服'Runco Co'情况的另一种方法。

declare @var1 nvarchar(20) = REVERSE('Runco Co') 
declare @var2 nvarchar(20) = REVERSE('Co')

Select REVERSE(
    CASE WHEN(CHARINDEX(' ',@var1) > LEN(@var2)) THEN
        SUBSTRING(@var1,PATINDEX('%'+@var2+'%',@var1)+LEN(@var2),LEN(@var1)-LEN(@var2))
    ELSE
        @var1
    END
)