【问题标题】:How can I remove the spaces from these numbers?如何从这些数字中删除空格?
【发布时间】:2022-01-05 09:53:14
【问题描述】:

我使用的是 SQL Server 2014,并且我的数据库中有一个表 (t1),其中包含一个名为“MealPlan”的列。

此列包含字符串列表(摘录如下):

                        MealPlan
Sansrepas315€/pers.=630€pour2pers.Devis/RésaSelectionner

Sansrepas394€/pers.=787€pour2pers.Devis/RésaSelectionner

Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner

Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner

Sansrepas700€/pers.=1 400€pour2pers.Devis/RésaSelectionner

Sansrepas328€/pers.=656€pour2pers.Devis/RésaSelectionner

我需要提取字符 =

之间的数字

我有以下代码可以满足我的需要:

SUBSTRING(MealPlan,LEN(LEFT(MealPlan,CHARINDEX('=', MealPlan)+1)),LEN(MealPlan) - LEN(LEFT(MealPlan,CHARINDEX('=', MealPlan))) - LEN(RIGHT(MealPlan,CHARINDEX('€', (REVERSE(MealPlan)))))) AS [Price]

运行上面我的栏目“价格”后出现如下:

Price
630
787
1 093
1 093
1 400
656

但是,我想去掉千位数字中的那个空格。

我的预期输出:

   Price
    630
    787
    1093
    1093
    1400
    656

我尝试了以下方法,但它不起作用:

REPLACE(SUBSTRING(MealPlan,LEN(LEFT(MealPlan,CHARINDEX('=', MealPlan)+1)),LEN(MealPlan) - LEN(LEFT(MealPlan,CHARINDEX('=', MealPlan))) - LEN(RIGHT(MealPlan,CHARINDEX('€', (REVERSE(MealPlan)))))), ' ','') AS [Price2]

任何帮助将不胜感激。

【问题讨论】:

  • 一定是一个空格吗?
  • 如果它只是一个空格,那么您尝试过的会奏效。所以它是别的东西。
  • @Nathan_Sav 当我复制输出并将其粘贴到 Excel 中时,它似乎是一个空格(一个仰泳将其删除)。
  • 看一下“空格”位置的字符代码,看看是什么。
  • 尝试将文件中的空格字符剪切'n'粘贴到 SQL 查询中,以防它是不同类型的空格?

标签: sql sql-server string


【解决方案1】:

我刚刚在我的示例数据库中运行了您的查询,它运行良好..

select 
REPLACE(SUBSTRING(Description,
LEN(LEFT(Description,CHARINDEX('=', Description)+1)),
LEN(Description) - LEN(LEFT(Description,CHARINDEX('=', Description))) - LEN(RIGHT(Description,CHARINDEX('€', (REVERSE(Description)))))
), ' ','') AS [Description]
from Worker

【讨论】:

  • 谢谢,但我没有。
【解决方案2】:

表#a1

| MealPlan |
| -------- |
| Sansrepas315€/pers.=630€pour2pers.Devis/RésaSelectionner   |
| Sansrepas394€/pers.=787€pour2pers.Devis/RésaSelectionner   |
| Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner |

查询

SELECT 
        REPLACE(
            SUBSTRING(MealPlan,CHARINDEX('=', MealPlan)+1, CHARINDEX('=',REVERSE(MealPlan)) - CHARINDEX('€',REVERSE(MealPlan)) -1 )  
            ,' ', ''
        )
        as value
FROM #a1

结果

value
630
787
1093

【讨论】:

  • 不适合我。
【解决方案3】:

上面 Jiří Baum 提供的关于“剪切和粘贴”的解决方案对我有用。

【讨论】:

    【解决方案4】:

    使用 XML 和 XQuery 对字符串进行标记非常容易。

    无需解析字符串,调用多个函数:SUBSTRING(), CHARINDEX(), PATINDEX(), LEN(), REVERSE()

    SQL

    -- DDL and sample data population, start
    DECLARE @tbl TABLE  (ID INT IDENTITY(1,1) PRIMARY KEY, MealPlan NVARCHAR(1000));
    INSERT INTO @tbl (MealPlan) VALUES
    (N'Sansrepas315€/pers.=630€pour2pers.Devis/RésaSelectionner'),
    (N'Sansrepas394€/pers.=787€pour2pers.Devis/RésaSelectionner'),
    (N'Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner'),
    (N'Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner'),
    (N'Sansrepas700€/pers.=1 400€pour2pers.Devis/RésaSelectionner'),
    (N'Sansrepas328€/pers.=656€pour2pers.Devis/RésaSelectionner');
    -- DDL and sample data population, end
    
    DECLARE @separator CHAR(1) = '='
        , @euro CHAR(1) = '€';
    
    
    SELECT t.* 
        , REPLACE(c.value('(/root/r[3]/text())[1]', 'VARCHAR(20)'),SPACE(1),'') AS Price
    FROM @tbl AS t
    CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
            REPLACE(REPLACE(MealPlan,@euro,@separator), @separator, ']]></r><r><![CDATA[') + 
            ']]></r></root>' AS XML)) AS t1(c);
    

    输出

    +----+------------------------------------------------------------+--------+
    | ID |                          MealPlan                          | Result |
    +----+------------------------------------------------------------+--------+
    |  1 | Sansrepas315€/pers.=630€pour2pers.Devis/RésaSelectionner   |    630 |
    |  2 | Sansrepas394€/pers.=787€pour2pers.Devis/RésaSelectionner   |    787 |
    |  3 | Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner |   1093 |
    |  4 | Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner |   1093 |
    |  5 | Sansrepas700€/pers.=1 400€pour2pers.Devis/RésaSelectionner |   1400 |
    |  6 | Sansrepas328€/pers.=656€pour2pers.Devis/RésaSelectionner   |    656 |
    +----+------------------------------------------------------------+--------+
    

    【讨论】:

      【解决方案5】:

      试试这个:

      Declare @MealPlan as varchar(250) = 'Sansrepas547€/pers.=1 093€pour2pers.Devis/RésaSelectionner'
      
      Select Replace(
                SUBSTRING(@MealPlan,
                          CharIndex('=', @MealPlan)+1, 
                          CharIndex(')',Replace(@MealPlan, '€p', ')'))- CharIndex('=', @MealPlan)-1 ),
                ' ', '')
      

      输出:

      如果这不起作用或者您在理解查询时遇到问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2021-05-10
        相关资源
        最近更新 更多