2017-11-03 17 views
0

アルファベットの前後に引用符を英数字の文字列で追加したいと考えています。例:私の文字列が8AB8973の場合、期待される出力は8'AB'8973です。数字や文字が出現する特定のパターンはありません。私はStackOverflowで見つけた次のコードを実行しようとしましたが、数字とアルファベットの間にスペースを追加します。スペースを引用符で置き換えると、クエリは永遠に実行されます。T-SQLを使用して英数字文字列でアルファ文字の前後に引用符を追加しますか?

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 

答えて

0

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; 
+0

トン場合、私は、最初の文字の前に引用符を含めるにはどうすればよいです彼は文字列で文字列で始まります。例:TAX000964の場合、上記の文字列は文字で始まります。このため、期待される結果は 'TAX'000964'です。上記の現在のクエリは私にTAX'000964を与えます。 –

+0

また、それは最後の文字の世話をしません。たとえば:00140M、期待される結果は00140'M 'になりますが、私は00140'Mを受け取ります。 –

0

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