How to strip all non-alphabetic characters from string in SQL Server?

后端 未结 18 1329
情深已故
情深已故 2020-11-21 23:49

How could you remove all characters that are not alphabetic from a string?

What about non-alphanumeric?

Does this have to be a custom function or are there

18条回答
  •  爱一瞬间的悲伤
    2020-11-22 00:25

    Here is another way to remove non-alphabetic characters using an iTVF. First, you need a pattern-based string splitter. Here is one taken from Dwain Camp's article:

    -- 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
    

    Now that you have a pattern-based splitter, you need to split the strings that match the pattern:

    [a-z]
    

    and then concatenate them back to get the desired result:

    SELECT *
    FROM tbl t
    CROSS APPLY(
        SELECT Item + ''
        FROM dbo.PatternSplitCM(t.str, '[a-z]')
        WHERE Matched = 1
        ORDER BY ItemNumber
        FOR XML PATH('')
    ) x (a)
    

    SAMPLE

    Result:

    | Id |              str |              a |
    |----|------------------|----------------|
    |  1 |    test“te d'abc |     testtedabc |
    |  2 |            anr¤a |           anra |
    |  3 |  gs-re-C“te d'ab |     gsreCtedab |
    |  4 |         M‚fe, DF |          MfeDF |
    |  5 |           R™temd |          Rtemd |
    |  6 |          ™jad”ji |          jadji |
    |  7 |      Cje y ret¢n |       Cjeyretn |
    |  8 |        J™kl™balu |        Jklbalu |
    |  9 |       le“ne-iokd |       leneiokd |
    | 10 |   liode-Pyr‚n‚ie |    liodePyrnie |
    | 11 |         V„s G”ta |          VsGta |
    | 12 |        Sƒo Paulo |        SoPaulo |
    | 13 |  vAstra gAtaland | vAstragAtaland |
    | 14 |  ¥uble / Bio-Bio |     ubleBioBio |
    | 15 | U“pl™n/ds VAsb-y |    UplndsVAsby |
    

提交回复
热议问题