2

我正在使用 SQL,一些列值表示为{3P Test } * 1 + 0.45%.

在这里,我在Test之后有尾随空格,我想将其更新为{3P Test} * 1 + 0.45%. 如何更新该列以删除括号中的尾随空格?

4

4 回答 4

1

类似的东西怎么样,小提琴在这里

SELECT
    l + '{' + rtrim(m) + '}' + r
  FROM
(
SELECT
    substring([Column], 0, a) l,
    substring([Column], a + 1, b - a - 1) m,
    substring([Column], b + 1, len([Column])- b) r
  FROM
(
SELECT
    [Column],
    charindex('{', [Column]) a,
    charindex('}', [Column]) b
  FROM
    [Table]
) [Pos]) [Bits]

正如您将注意到的,前面的语句只是选择更正的数据。你可以像这样更新它, Fiddle Here

UPDATE [Table]
    SET [Column] = l + '{' + rtrim(m) + '}' + r
  FROM
(
SELECT
    [Column],
    substring([Column], 0, a) l,
    substring([Column], a + 1, b - a - 1) m,
    substring([Column], b + 1, len([Column])- b) r
  FROM
(
SELECT
    [Column],
    charindex('{', [Column]) a,
    charindex('}', [Column]) b
  FROM
    [Table]
) [Pos]) [Bits]
JOIN [Table] ON [Table].[Column] = [Bits].[Column];

如果已知主键,则可以改进此语句[Table]

于 2014-07-16T16:20:46.680 回答
0

如果这是一次更新,或者如果没有那么多行,那么迭代方法(如对问题的评论中所建议的那样)可以工作,但如果有很多数据,因为每次迭代UPDATE都是一个事务(除非您BEGIN TRANSACTION在循环之前显式执行WHILE,但是如果该操作需要一段时间,它将阻止该表进行其他操作)。

例如:

DECLARE @TestTable TABLE (String NVARCHAR(4000));
INSERT INTO @TestTable (String) VALUES (N'{3P Test   } * 1 + 0.45%');

SELECT * FROM @TestTable;

WHILE (EXISTS(
          SELECT *
          FROM @TestTable tmp
          WHERE tmp.String LIKE N'% }%'
          )
      )
BEGIN
   UPDATE TOP (100) tmp -- do this in batches to reduce transaction size
   SET tmp.String = REPLACE(tmp.String, N' }', N'}')
   FROM @TestTable tmp
   WHERE tmp.String LIKE N'% }%';
END;

SELECT * FROM @TestTable;

或者,这是@Jodrell 提出的想法的简化版本,CHARINDEX它使用 CTE 而不是多个子查询(不需要到JOIN基表)并将字符串分成 2 部分而不是 3 部分:

DECLARE @TestTable TABLE (String NVARCHAR(4000));
INSERT INTO @TestTable (String) VALUES (N'{3P Test               } * 1 + 0.45%');
INSERT INTO @TestTable (String) VALUES (N'{3P Test     4       } * 1 + 0.45%');

SELECT * FROM @TestTable;

WHILE (EXISTS(
          SELECT *
          FROM @TestTable tmp
          WHERE tmp.String LIKE N'% }%'
          )
      )
BEGIN

   ;WITH cte AS
   (
      SELECT TOP (100)
             tmp.String,
             CHARINDEX(N'}', tmp.String) AS [RightBracketLocation]
      FROM @TestTable tmp
      WHERE tmp.String LIKE N'% }%'
   )
   UPDATE cte
   SET cte.String =
             RTRIM(SUBSTRING(cte.String, 1, (cte.[RightBracketLocation] - 1)))
             + SUBSTRING(cte.String, [RightBracketLocation], 4000)
   FROM cte;

END;

SELECT * FROM @TestTable;

但是,如果这是一个常见的操作,那么更直接和直接的东西会更好,比如正则表达式。没有内置的正则表达式函数,因此您需要使用 SQLCLR 来获得该功能。例如:

DECLARE @Test NVARCHAR(4000);
SET @Test = N'{3P Test   } * 1 + 0.45%';

SELECT SQL#.RegEx_Replace(@Test, N'\s+}', N'}', -1, 1, N'IgnoreCase');

在示例中,我使用的是SQL#库(我是该库的作者,但正则表达式函数在免费版本中可用)。

于 2014-07-16T16:03:59.770 回答
0
SELECT LTRIM(RTRIM('{3P Test } * 1 + 0.45%'))

update table set COL1 = LTRIM(RTRIM(COL1))
于 2014-07-16T15:56:21.107 回答
0

您可以在 WHILE 循环中使用 REPLACE 函数,例如:

SELECT '{3P Test   } * 1 + 0.45%' AS TestCol INTO #temp 
UNION 
SELECT '{3P Test } * 1 + 0.45%' 

SELECT * FROM #temp

WHILE (SELECT COUNT(*) FROM #temp WHERE TestCol LIKE '% }%') > 0
  BEGIN
    UPDATE #temp
    SET TestCol = REPLACE(TestCol, ' }', '}')
  END

SELECT * FROM #temp 

DROP TABLE #temp 
于 2014-07-16T15:57:22.797 回答