【问题标题】:Query to remove trailing or leading space from middle of the string using sql server查询以使用 sql server 从字符串中间删除尾随或前导空格
【发布时间】:2018-11-16 18:54:31
【问题描述】:

我有一列数据如下 -

我想删除数据中第一个'-'字符之前和之后的任何[空格],以便我可以获得以下清理后的数据 -

如何将其编写为 SQL 查询?

【问题讨论】:

  • 你的意思是B20 - 86..变成B20-86..
  • 是的,没错
  • 总是以 3 个字符开头吗?
  • 不...这就是为什么有必要查找连字符“-”的第一个实例并删除它之前或之后的任何空格。
  • 您想在第一个“-”之后保留有空格的实例吗?意思是“ABC - ABC - DEF”变成“ABC-ABC - DEF”而不是“ABC-ABC-DEF”

标签: sql sql-server tsql trim sql-server-2017


【解决方案1】:

试试这个

CREATE TABLE Spaces(
  Value VARCHAR(45)
);

INSERT INTO Spaces VALUES
('B2555 - 30...'),
('Babc30 - 40 ...'),
('B5- 50..'),
('B6AfG066ML -60..');


SELECT CASE WHEN CHARINDEX(' -', Value) > 0 THEN
            STUFF(Value, CHARINDEX(' -', Value), 1, '')
            ELSE
            Value
            End Result
FROM
    (
      SELECT CASE WHEN CHARINDEX('- ', Value) > 0 THEN
                  STUFF(Value, CHARINDEX('- ', Value) + 1, 1, '')
                  ELSE
                  Value
                  End Value
      FROM
          (
            SELECT CASE WHEN CHARINDEX(' - ', Value) > 0 THEN
                        STUFF(Value, CHARINDEX(' - ', Value), 1, '')
                        ELSE
                        Value
                        End Value
            FROM Spaces
          ) T1
    ) T2;

返回:

+------------------------+
|         Result         |
+------------------------+
| B2555-30- ABC - ABC... |
| Babc30-40 ...          |
| B5-50..                |
| B6AfG066ML-60..        |
+------------------------+

Demo

【讨论】:

    【解决方案2】:

    这是您的另一个选择。

    这是假设如下:

    • 仅删除第一个 '-' 实例周围的借用或尾随空格,所有其他都将被保留。
    • 仅占 1 且仅占前导或尾随空格。
    • 可能已经“清理”了数据。

    试试这个:

    DECLARE @TestData TABLE
        (
            [StringData] NVARCHAR(100)
        );
    
    
    INSERT INTO @TestData (
                              [StringData]
                          )
    VALUES ( 'ADFADSF- ASDFSADF - Q343243498' )
         , ( 'ABC - EFSSADF - 2345234532' )
         , ( 'EFGSADFSA -ASDFSADF - 2342345234' )
         , ( 'ASDF34 - ASDLFASDJF - 234234 - 34324' )
         , ( 'ABC-123 - 465 - 685' );
    
    SELECT *
         , STUFF([StringData]
                  , CHARINDEX('-', [StringData]) - 1
                  , 3
                  , REPLACE(SUBSTRING([StringData], CHARINDEX('-', [StringData]) - 1, 3), ' ', '')
                ) AS [CleanStringData]
    FROM   @TestData;
    

    基本上,它的作用是将 '-' 之前的 1 个字符去除为之后的一个,替换那些相同的字符,但如果存在空格,则删除它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多