【问题标题】:How to find and remove alphabet letters in in a column on MS sql server如何在 MS sql server 的列中查找和删除字母
【发布时间】:2019-02-15 20:43:50
【问题描述】:

我有一列字母数字 ID,我们称之为 [IDS]。

id 只能是数字,但其中一些有杂散字符。

例如:

[IDS]

 - 012345A
 - 23456789AF
 - 789789

我只想将这些转换为数字 - 所以输出将是:

[IDS]
012345
23456789
789789

我想编写一些代码,在列中搜索字母表 (A-Z) 中的所有字母并删除它们,以便提取数值。

我知道我可以做一个 replace(replace(replace(..etc),但是对于字母表中的所有 26 个字母,这并不理想。

我现在正在尝试使用“声明@”来解决它,但这些似乎是为特定字符串设计的,我希望搜索和替换整个列。

使用 Microsoft SQL Server。

谢谢

【问题讨论】:

  • 您能否展示我们可能在您的表格中看到的所有IDS 值的包容性示例?请向我们展示更多数据。在一般情况下,进行丑陋的替换或使用自定义 UDF 基本上是您的选择。
  • @sqlproblem 。 . .字母总是在最后吗?
  • @GordonLinoff 到目前为止是的,但理想情况下,我们想要一个解决方案,如果它们将来不存在的话
  • @sqlproblem 。 . .那么 UDF 是最好的解决方案,虽然你不会喜欢它的性能。

标签: sql sql-server


【解决方案1】:

要把这个丑陋的野兽扔在这里......

SELECT REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE(REPLACE (
       REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE(REPLACE (
       REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE(
       REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE 
      (IDS, 'A', ''), 'B', ''), 'C', ''), 'D', ''), 'E', ''), 'F', ''), 'G', '') 
                    , 'H', ''), 'I', ''), 'J', ''), 'K', ''), 'L', ''), 'M', '') 
                    , 'N', ''), 'O', ''), 'P', ''), 'Q', ''), 'R', ''), 'S', '')
                    , 'T', ''), 'U', ''), 'V', ''), 'W', ''), 'X', ''), 'y', '')
                    , 'Z', '')    
FROM #Table11

【讨论】:

    【解决方案2】:

    你可以创建一个函数:

    CREATE FUNCTION getNumber(@string VARCHAR(1500))
        RETURNS VARCHAR(1500)
    AS
    BEGIN
        DECLARE @count int
        DECLARE @intNumbers VARCHAR(1500)
        SET @count = 0
        SET @intNumbers = ''
    
        WHILE @count <= LEN(@string)
        BEGIN 
            IF SUBSTRING(@string, @count, 1)>='0' and SUBSTRING (@string, @count, 1) <='9'
                BEGIN
                    SET @intNumbers = @intNumbers + SUBSTRING (@string, @count, 1)
                END
            SET @count = @count + 1
        END
        RETURN @intNumbers
    END
    GO 
    

    然后调用它:

    SELECT dbo.getNumber('23456789AF') As "Number"
    
    Number
    23456789
    

    Rextester Demo

    【讨论】:

      【解决方案3】:

      首先创建这个UDF

      CREATE FUNCTION dbo.udf_GetNumeric
      (@strAlphaNumeric VARCHAR(256))
      RETURNS VARCHAR(256)
      AS
      BEGIN
      DECLARE @intAlpha INT
      SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
      BEGIN
      WHILE @intAlpha > 0
      BEGIN
      SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
      SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
      END
      END
      RETURN ISNULL(@strAlphaNumeric,0)
      END
      GO
      

      现在使用 function 作为

      SELECT dbo.udf_GetNumeric(column_name) 
      from table_name
      

      SQL FIDDLE

      希望这能解决你的问题。

      Reference

      【讨论】:

        【解决方案4】:
        CREATE TABLE #Table11
            ([IDS] varchar(10))
        ;
        
        INSERT INTO #Table11
            ([IDS])
        VALUES
            ('012345A'),
            ('23456789AF'),
            ('789789')
        ;
        
        
        SELECT SUBSTRING([IDS], PATINDEX('%[0-9]%', [IDS]), PATINDEX('%[0-9][^0-9]%', [IDS] + 't') - PATINDEX('%[0-9]%', 
                            [IDS]) + 1) AS IDS
        FROM #Table11
        

        输出

        IDS
        012345
        23456789
        789789
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-16
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 2020-07-07
          • 2019-11-27
          • 1970-01-01
          • 2018-03-23
          相关资源
          最近更新 更多