192 votes

Comment faire pour supprimer tous les caractères non alphabétiques de chaîne dans SQL Server ?

Comment est-ce que vous pourriez supprimer tous les caractères non alphabétiques d’une chaîne ?

Qu’en est-il non alphanumérique ?

Cela doit-il être une fonction personnalisée ou y a-t-il aussi des solutions plus généralisables ?

396voto

G Mastros Points 12241

Essayez cette fonction :

Appelez-le comme ceci :

Une fois que vous comprenez le code, vous devriez voir que c’est relativement simple de le changer pour supprimer les autres personnages, trop. Vous pourriez même faire cela assez dynamique pour passer dans votre modèle de recherche.

Elle pourra être qu'utile.

194voto

Even Mien Points 10122

Version paramétrable de Mastros G' réponse génial:

Alphabetic uniquement :

Numérique uniquement :

Alphanumérique uniquement :

Non alphanumériques :

6voto

Rob Garrison Points 2977

Je savais que SQL a été mauvais lors de la manipulation de la chaîne, mais je ne pensais pas que ce serait aussi difficile. Voici une fonction simple de supprimer tous les numéros à partir d'une chaîne. Il y aurait de meilleures façons de le faire, mais c'est un début.

CREATE FUNCTION dbo.AlphaOnly (
    @String varchar(100)
)
RETURNS varchar(100)
AS BEGIN
  RETURN (
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(
              REPLACE(
                REPLACE(
                  REPLACE(
                    REPLACE(
                      REPLACE(
                        @String,
                      '9', ''),
                    '8', ''),
                  '7', ''),
                '6', ''),
              '5', ''),
            '4', ''),
          '3', ''),
        '2', ''),
      '1', ''),
    '0', '')
  )
END
GO

-- ==================
DECLARE @t TABLE (
    ColID       int,
    ColString   varchar(50)
)

INSERT INTO @t VALUES (1, 'abc1234567890')

SELECT ColID, ColString, dbo.AlphaOnly(ColString)
FROM @t

Sortie

ColID ColString
----- ------------- ---
    1 abc1234567890 abc

Ronde 2 - Piloté Par Les Données De La Liste Noire

-- ============================================
-- Create a table of blacklist characters
-- ============================================
IF EXISTS (SELECT * FROM sys.tables WHERE [object_id] = OBJECT_ID('dbo.CharacterBlacklist'))
  DROP TABLE dbo.CharacterBlacklist
GO
CREATE TABLE dbo.CharacterBlacklist (
    CharID              int         IDENTITY,
    DisallowedCharacter nchar(1)    NOT NULL
)
GO
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'0')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'1')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'2')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'3')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'4')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'5')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'6')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'7')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'8')
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'9')
GO

-- ====================================
IF EXISTS (SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID('dbo.StripBlacklistCharacters'))
  DROP FUNCTION dbo.StripBlacklistCharacters
GO
CREATE FUNCTION dbo.StripBlacklistCharacters (
    @String nvarchar(100)
)
RETURNS varchar(100)
AS BEGIN
  DECLARE @blacklistCt  int
  DECLARE @ct           int
  DECLARE @c            nchar(1)

  SELECT @blacklistCt = COUNT(*) FROM dbo.CharacterBlacklist

  SET @ct = 0
  WHILE @ct < @blacklistCt BEGIN
    SET @ct = @ct + 1

    SELECT @String = REPLACE(@String, DisallowedCharacter, N'')
    FROM dbo.CharacterBlacklist
    WHERE CharID = @ct
  END

  RETURN (@String)
END
GO

-- ====================================
DECLARE @s  nvarchar(24)
SET @s = N'abc1234def5678ghi90jkl'

SELECT
    @s                  AS OriginalString,
    dbo.StripBlacklistCharacters(@s)   AS ResultString

Sortie

OriginalString           ResultString
------------------------ ------------
abc1234def5678ghi90jkl   abcdefghijkl

Mon défi pour les lecteurs: Pouvez-vous à le rendre plus efficace? Que penser de l'utilisation de la récursivité?

4voto

Kyle Hale Points 2989

Si vous êtes comme moi et que vous n’avez pas accès à un peu ajouter des fonctions à votre production données mais toujours souhaitez effectuer ce type de filtrage, voici une solution pure de SQL à l’aide d’un tableau croisé dynamique pour mettre les morceaux filtrées à nouveau ensemble.

N.-b. J’ai codé en dur la table jusqu'à 40 caractères, vous devrez en rajouter si vous avez des chaînes plus longues pour filtrer.

1voto

user381460 Points 11

J’ai mis cela dans les deux endroits où PatIndex est appelée.

pour la coutume fonctionne au-dessus de RemoveNonAlphaCharacters et le renomme RemoveNonAlphaNumericCharacters

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X