【问题标题】:I want to remove part of string from a string我想从字符串中删除部分字符串
【发布时间】:2017-03-28 06:05:10
【问题描述】:

提前谢谢你。

我想删除 . 之后的字符串,包括 .,但是长度是可变的,字符串可以是任意长度。

1) 示例:
输入:-SCC0204.X and FRK0005.X and RF0023.X and ADF1010.A and HGT9010.V

输出:SCC0204 and FRK0005 and RF0023 and ADF1010.A and HGT9010.V

我尝试使用 charindex,但随着长度不断变化,我无法做到。我想修剪仅以 X 结尾的值

任何帮助将不胜感激。

【问题讨论】:

  • 总是只有一个点吗?
  • 你在使用oracle吗?
  • 是的,我只有一个点。我想只用.X 修剪值,我正在使用 mssql 2010

标签: sql tsql


【解决方案1】:

假设只有一个点

UPDATE TABLE 
SET column_name = left(column_name, charindex('.', column_name) - 1)

对于选择

select left(column_name, charindex('.', column_name) - 1) AS col
from your_table

【讨论】:

    【解决方案2】:

    希望这会有所帮助。该代码仅在值具有小数点“。”时修剪字符串。如果该值等于.X

    ;WITH cte_TestData(Code) AS
    (
    SELECT 'SCC0204.X' UNION ALL
    SELECT 'FRK0005.X' UNION ALL
    SELECT 'RF0023.X' UNION ALL
    SELECT 'ADF1010.A' UNION ALL
    SELECT 'HGT9010.V' UNION ALL
    SELECT 'SCC0204' UNION ALL
    SELECT 'FRK0005'
    )
    SELECT CASE 
            WHEN CHARINDEX('.', Code) > 0 AND RIGHT(Code,2) = '.X'
                THEN SUBSTRING(Code, 1, CHARINDEX('.', Code) - 1)
            ELSE Code
            END
    FROM cte_TestData
    

    如果标准只是替换删除.X,那么这可能也应该工作

    ;WITH cte_TestData(Code) AS
    (
    SELECT 'SCC0204.X' UNION ALL
    SELECT 'FRK0005.X' UNION ALL
    SELECT 'RF0023.X' UNION ALL
    SELECT 'ADF1010.A' UNION ALL
    SELECT 'HGT9010.V' UNION ALL
    SELECT 'SCC0204' UNION ALL
    SELECT 'FRK0005'
    )
    SELECT REPLACE (Code,'.X','')
    FROM cte_TestData
    

    【讨论】:

      【解决方案3】:

      使用左字符串函数:

       DECLARE @String VARCHAR(100) = 'SCC0204.XXXXX'
       SELECT LEFT(@String,CHARINDEX('.', @String) - 1)
      

      【讨论】:

        【解决方案4】:

        我认为你最好的选择是创建一个解析字符串并使用正则表达式的函数。我希望这篇旧帖子对您有所帮助:

        Perform regex (replace) in an SQL query

        但是,如果您需要修剪的值始终是“.X”,那么您应该使用 选择替换(字符串,'.x','')

        【讨论】:

        • 从您提供的链接中添加所需的代码,就好像链接中的代码将被更改一样,这可能不是有用的答案。
        【解决方案5】:

        请检查以下代码。我想这会对你有所帮助。

        DECLARE @String VARCHAR(100) = 'SCC0204.X'
        IF (SELECT RIGHT(@String,2)) ='.X'
           SELECT LEFT(@String,CHARINDEX('.', @String) - 1)
        ELSE 
          SELECT @String
        

        【讨论】:

          【解决方案6】:

          更新:我刚刚错过了 OP 阐明要求的 cmets 之一。我在下面汇总的是您将如何处理删除以 X 结尾的字符串上的第一个点之后的所有内容的要求。我将其留在这里以供参考。

          ;WITH cte_TestData(Code) AS
          (
            SELECT 'SCC0204.X'  UNION ALL -- ends with '.X'
            SELECT 'FRK.000.X'  UNION ALL -- ends with '.X', contains multiple dots
            SELECT 'RF0023.AX'  UNION ALL -- ends with '.AX'
            SELECT 'ADF1010.A'  UNION ALL -- ends with '.A'
            SELECT 'HGT9010.V'  UNION ALL -- ends with '.V'
            SELECT 'SCC0204.XF' UNION ALL -- ends with '.XF'
            SELECT 'FRK0005'    UNION ALL -- totally clean
            SELECT 'ABCX'                 -- ends with 'X', not dots
          )
          SELECT 
            orig_string = code,
            newstring   = 
            SUBSTRING
            (
              code, 1,
              CASE 
                WHEN code LIKE '%X'
                THEN ISNULL(NULLIF(CHARINDEX('.',code)-1, -1), LEN(code))
                ELSE LEN(code)
              END
            )
          FROM cte_TestData;
          

          仅供参考 - SQL Server 2012+ 您可以像这样简化此代码:

          SELECT 
            orig_string = code,
            newstring   = 
            SUBSTRING(code, 1,IIF(code LIKE '%X', ISNULL(NULLIF(CHARINDEX('.',code)-1, -1), LEN(code)), LEN(code)))
          FROM cte_TestData;
          

          【讨论】:

            【解决方案7】:

            使用 SUBSTRING,您可以通过以下代码实现您的要求。

            SELECT SUBSTRING(column_name, 0, CHARINDEX('.', column_name)) AS col
            FROM your_table
            

            如果你想从字符串中移除固定的.X,你也可以使用REPLACE函数。

            SELECT REPLACE(column_name, '.X', '') AS col
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-01
              • 1970-01-01
              • 2017-07-02
              • 2013-10-09
              • 1970-01-01
              相关资源
              最近更新 更多