【问题标题】:Add quotes around alpha characters in alphanumeric strings using T-SQL?使用 T-SQL 在字母数字字符串中的字母字符周围添加引号?
【发布时间】:2018-04-16 17:09:47
【问题描述】:

我想在字母数字字符串中的字母周围添加引号。例如:如果我的字符串是 8AB8973,则预期的输出是 8'AB'8973。没有特定的模式会出现数字和字符。我尝试运行在 StackOverflow 上找到的以下代码,但它在数字和字母之间添加了一个空格,当我尝试用引号替换空格时,查询需要永远运行。

    DECLARE @position INT;
    DECLARE @string VARCHAR(max);

    SET @string = '9FX8173'

    WHILE 1 = 1
      BEGIN
          SET @position = (SELECT Min(position)
                           FROM   (VALUES (Patindex('%[^ 0-9][0-9]%', @string)),
                                          (Patindex('%[0-9][^ 0-9]%', @string))) AS T(position)
                           WHERE  T.position > 0);

          IF @position IS NULL
            BREAK;

          SET @string = Stuff(@string, @position + 1, 0, ' ');
       END

       PRINT @string

【问题讨论】:

    标签: sql-server tsql split quotes alphanumeric


    【解决方案1】:

    对于纯粹基于集合的高性能解决方案,您可以使用PatternSplitCM

    函数

    -- PatternSplitCM will split a string based on a pattern of the form 
    -- supported by LIKE and PATINDEX 
    -- 
    -- Created by: Chris Morris 12-Oct-2012 
    CREATE FUNCTION dbo.PatternSplitCM
    (
      @List               VARCHAR(8000) = NULL,
      @Pattern            VARCHAR(50)
    ) RETURNS TABLE WITH SCHEMABINDING 
    AS 
    RETURN
        WITH numbers AS (
          SELECT TOP(ISNULL(DATALENGTH(@List), 0))
           n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
          FROM
          (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n),
          (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n),
          (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n),
          (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n))
    
        SELECT
          ItemNumber = ROW_NUMBER() OVER(ORDER BY MIN(n)),
          Item = SUBSTRING(@List,MIN(n),1+MAX(n)-MIN(n)),
          [Matched]
         FROM (
          SELECT n, y.[Matched], Grouper = n - ROW_NUMBER() OVER(ORDER BY y.[Matched],n)
          FROM numbers
          CROSS APPLY (
              SELECT [Matched] = CASE WHEN SUBSTRING(@List,n,1) LIKE @Pattern THEN 1 ELSE 0 END
          ) y
         ) d
         GROUP BY [Matched], Grouper
    GO
    

    解决方案

    DECLARE @string VARCHAR(max);
    
    SET @string = '9FX81D73';
    
    select newstring = 
    (
      select case [matched] when 1 then  ''''+item+'''' else item end
      from dbo.PatternSplitCM(@string, '[a-zA-Z]')
      order by itemnumber
      for xml path('')
    );
    

    结果

    newstring
    ----------------------
    9'FX'81'D'73
    

    【讨论】:

      【解决方案2】:

      除了在 STUFF 函数中用引号替换空格之外,您还需要在 PATINDEX 搜索表达式中做同样的事情:

      DECLARE @position INT;
      DECLARE @string VARCHAR(max);
      
      SET @string = '9FX8173';
      
      WHILE 1 = 1
      BEGIN
          SET @position = (
              SELECT MIN(position)
              FROM (VALUES (PATINDEX('%[^''0-9][0-9]%', @string)),
                           (PATINDEX('%[0-9][^''0-9]%', @string))) AS T(position)
              WHERE  T.position > 0);
      
          IF @position IS NULL
              BREAK;
      
          SET @string = STUFF(@string, @position + 1, 0, '''');
      END
      
      PRINT @string;
      

      【讨论】:

      • 如果字符串以字符开头,我如何在第一个字符之前包含引号,例如:TAX000964,上面的字符串以字符开头,因此预期结果是'TAX'000964。上面提到的当前查询给了我 TAX'000964。
      • 另外,它不处理最后一个字符,例如:00140M,预期结果是 00140'M',但我收到的是 00140'M。
      猜你喜欢
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多