无法在SQL中正确替换缩写文本

时间:2018-03-22 20:04:17

标签: sql sql-server replace abbreviation

我正在尝试用相应的详细描述替换一堆难以解密的缩写。我有一个名为Abbreviations的表,它只包含要查找的缩写列表以及它们应该更改的相应描述。此外,“替换”表包含一个未更改的缩写描述列表,我想在名为“DescriptionCodes”的单个列中更改

我想要改变的数据是不同茶的清单。例如,条目 “TADIN H-B GR”将是“TADIN HERBAL BAG GREEN”的缩写

我目前使用的SQL代码如下所示:

BEGIN TRANSACTION
DECLARE @Desc varchar(500)
DECLARE @Abbr varchar(500)

DECLARE contact_cursor CURSOR FOR
SELECT Description, Abbrv FROM dbo.Abbreviations

OPEN contact_cursor

FETCH NEXT FROM contact_cursor
INTO @Desc, @Abbr

WHILE @@FETCH_STATUS = 0
BEGIN
  PRINT 'Changing ' + @Abbr + ' to ' + @Desc

  UPDATE Replaced
  SET DescriptionCodes = REPLACE(DescriptionCodes, @Abbr, @Desc)
  WHERE DescriptionCodes LIKE CONCAT('% ', @Abbr, ' %')

  FETCH NEXT FROM contact_cursor
  INTO @Desc, @Abbr
END

CLOSE contact_cursor
DEALLOCATE contact_cursor

COMMIT

当然,我遇到的问题是,一旦应用了缩写,详细描述可能包含一个子字符串,该字符串与另一个缩写相匹配,然后应用该缩写。例如,PKG可能会更改为PACKAGE,但PA也是PINEAPPLE的缩写,这意味着一旦应用了此更改,最终结果将是PINEAPPLECKAGE。每个缩写在任一侧都有一个空格,所以我想使用这个事实不更新任何缩写,两边都没有空格,因此 我的代码中的CONCAT('%',@ Abbr,'%')。但是,当我尝试这种方法时,基本上什么都没有改变。通过删除该约束,我已经能够看到有限的成功,但另一个问题则发生了。关于如何确保只考虑和更新任何一方都有空格的缩写的任何想法?

更新: 在尝试了这里发布的几个解决方案后,我仍然无法让它工作,我不知道为什么。无论如何,这是正确的。以下是我正在使用的一些数据的示例:

JUSTEA HBL PKG CMCL CHM LG LR  1.5OZ
PRIDE OF INDIA BG ASM B BKFST  25 CT
CTL BR H-B 7BLSM PP            1 CT
POSTI H-B HRH CRN              20 CT
DRS H-B EPGP LPLDS PTVP TGN    20 CT
ULTLC BG CHG                   100 CT
PG TIPS BG D B                 40 CT
RPBL R-B B HLDY FT BLD         6 CT

这很好,看起来它应该转换没有问题。然而,当我运行带有空格的代码时(与“LIKE'%'+ @Abbr +'%'”一样,这是我的第一个倾向)数据保持完全不变。如果我删除它们,数据就变得完全无法理解。例如,以PRIDE OF INDIA开头的行变为

印度的骄傲(N)IRISH AFTERNOON BLACK AG ASIA PLUM RICOT SPICE(D)EARMINT BLACK BLACK KFST 25 CURRANT AN A N T

我觉得我应该注意到这些数据最初是从Excel Spreadsheets导入的。是否有机会与未被识别的空间有任何关系?

3 个答案:

答案 0 :(得分:0)

为什么要使用" LIKE"如果您要添加空格?只是做:

WHERE DescriptionCodes = @Abbr

答案 1 :(得分:0)

你可以做到这一点,它将实现你想要做的事情:

  LIKE '% ' + @Abbr + ' %'

答案 2 :(得分:0)

我认为您需要多次更新“替换”表的每个记录,并且需要考虑缩写的4个位置(单独,第一,中间,最后)。像这样:

DECLARE @Replaced TABLE ([DescriptionCodes] varchar(50))
DECLARE @Abbreviations TABLE ([Abbrv] varchar(50), [Description] varchar(50))

INSERT INTO @Replaced([DescriptionCodes]) VALUES ('TADIN H-B GR')
INSERT INTO @Replaced([DescriptionCodes]) VALUES ('PKG')
INSERT INTO @Replaced([DescriptionCodes]) VALUES ('PKG PA')

INSERT INTO @Abbreviations([Abbrv], [Description]) VALUES ('H-B', 'HERBAL BAG')
INSERT INTO @Abbreviations([Abbrv], [Description]) VALUES ('GR', 'GREEN')
INSERT INTO @Abbreviations([Abbrv], [Description]) VALUES ('PKG', 'PACKAGE')
INSERT INTO @Abbreviations([Abbrv], [Description]) VALUES ('PA', 'PINAPPLE')

DECLARE @RowCount int;

WHILE 1 = 1
BEGIN
    SET @RowCount = 0;

    UPDATE r
    SET r.[DescriptionCodes] = REPLACE(r.[DescriptionCodes], a.[Abbrv], a.[Description])
    FROM @Replaced r join @Abbreviations a ON r.[DescriptionCodes] = a.[Abbrv];
    SET @RowCount = @RowCount + @@RowCount;

    UPDATE r
    SET r.[DescriptionCodes] = REPLACE(r.[DescriptionCodes], ' ' + a.[Abbrv] + ' ', ' ' + a.[Description] + ' ')
    FROM @Replaced r join @Abbreviations a ON r.[DescriptionCodes] like '% ' + a.[Abbrv] + ' %';
    SET @RowCount = @RowCount + @@RowCount;

    UPDATE r
    SET r.[DescriptionCodes] = REPLACE(r.[DescriptionCodes], ' ' + a.[Abbrv],' ' + a.[Description])
    FROM @Replaced r join @Abbreviations a ON r.[DescriptionCodes] like '% ' + a.[Abbrv];
    SET @RowCount = @RowCount + @@RowCount;

    UPDATE r
    SET r.[DescriptionCodes] = REPLACE(r.[DescriptionCodes], a.[Abbrv] + ' ', a.[Description] + ' ')
    FROM @Replaced r join @Abbreviations a ON r.[DescriptionCodes] like a.[Abbrv] + ' %';
    SET @RowCount = @RowCount + @@RowCount;

    IF @ROWCOUNT = 0 BREAK;
END

SELECT * FROM @Replaced