10
votes

T-SQL Strip tous les caractères non alpha et non numériques

Y a-t-il un moyen plus intelligent d'éliminer tous les caractères spéciaux plutôt que d'avoir une série d'environ 15 relevés de remplacement imbriqués?

Les œuvres suivantes, mais ne gère que trois caractères (ampersand, vierge et période). xxx


0 commentaires

5 Réponses :


1
votes

Si vous pouvez utiliser SQL CLR Vous pouvez utiliser des expressions régulières .NET pour cela.

Il existe un paquet tiers (gratuit) qui inclut cela et plus - SQL Sharp .


0 commentaires

17
votes

une voie flexible-ish; xxx


4 commentaires

Je vois que tout le monde recommande des fonctions. J'aime l'idée d'utiliser une fonction définie par l'utilisateur, mais il doit ensuite passer à travers le contrôle de changement pour accéder à l'environnement de production. Il n'y a aucun moyen d'avoir une fonction en ligne dans la requête, est là? Je ne sais pas dans quelle langue ils utilisent pour appeler la requête SQL, peut-être VBScript ou PowerShell, mais maintenant je pense que cela sera beaucoup plus facile de faire le décapage dans cette langue.


Comme une table de table ou de calendrier de chiffres, ou des fonctions qui divisent ou concaténent des chaînes, une fonction pouvant faire ce type de chose est un module pratique pour avoir autour. Même si cela n'arrive pas immédiatement, vous devriez envisager d'avoir ces éléments dans une base de données utilitaire. Je ne sais pas que l'exécution de cela dans le code est toujours la meilleure réponse soit, surtout si plusieurs applications différentes doivent faire la même chose ...


@Alex K., j'aime mieux cette solution que la mienne. Je n'ai jamais aimé avoir à examiner la chaîne un personnage à la fois. Avez-vous un moyen de remplacer les espaces supplémentaires et les caractères spéciaux (CR / LF, TAB)?


Si quiconque cherche à inclure uniquement l'alphanumérique, vous pouvez simplement l'utiliser comme modèle avec la fonction ci-dessus: '% [^ A-Z0-9]%'



6
votes

J'ai fait face à ce problème il y a plusieurs années, j'ai donc écrit une fonction SQL pour faire le tour. Voici l'article original (a été utilisé pour Grattez le texte de HTML). J'ai depuis mis à jour la fonction, comme suit:

IF (object_id('dbo.fn_CleanString') IS NOT NULL)
BEGIN
  PRINT 'Dropping: dbo.fn_CleanString'
  DROP function dbo.fn_CleanString
END
GO
PRINT 'Creating: dbo.fn_CleanString'
GO
CREATE FUNCTION dbo.fn_CleanString 
(
  @string varchar(8000)
) 
returns varchar(8000)
AS
BEGIN
---------------------------------------------------------------------------------------------------
-- Title:        CleanString
-- Date Created: March 26, 2011
-- Author:       William McEvoy
--               
-- Description:  This function removes special ascii characters from a string.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


declare @char        char(1),
        @len         int,
        @count       int,
        @newstring   varchar(8000),
        @replacement char(1)

select  @count       = 1,
        @len         = 0,
        @newstring   = '',
        @replacement = ' '



---------------------------------------------------------------------------------------------------
-- M A I N   P R O C E S S I N G
---------------------------------------------------------------------------------------------------


-- Remove Backspace characters
select @string = replace(@string,char(8),@replacement)

-- Remove Tabs
select @string = replace(@string,char(9),@replacement)

-- Remove line feed
select @string = replace(@string,char(10),@replacement)

-- Remove carriage return
select @string = replace(@string,char(13),@replacement)


-- Condense multiple spaces into a single space
-- This works by changing all double spaces to be OX where O = a space, and X = a special character
-- then all occurrences of XO are changed to O,
-- then all occurrences of X  are changed to nothing, leaving just the O which is actually a single space
select @string = replace(replace(replace(ltrim(rtrim(@string)),'  ', ' ' + char(7)),char(7)+' ',''),char(7),'')


--  Parse each character, remove non alpha-numeric

select @len = len(@string)

WHILE (@count <= @len)
BEGIN

  -- Examine the character
  select @char = substring(@string,@count,1)


  IF (@char like '[a-z]') or (@char like '[A-Z]') or (@char like '[0-9]')
    select @newstring = @newstring + @char
  ELSE
    select @newstring = @newstring + @replacement

  select @count = @count + 1

END


return @newstring
END

GO
IF (object_id('dbo.fn_CleanString') IS NOT NULL)
  PRINT 'Function created.'
ELSE
  PRINT 'Function NOT created.'
GO


1 commentaires

J'aime l'idée d'utiliser une fonction définie par l'utilisateur, mais il doit ensuite passer à travers le contrôle de changement pour accéder à l'environnement de production.



10
votes

Créer une fonction:

r
------
Bobsdog1friendaredopeyo


5 commentaires

@Brian s'il vous plaît ne modifiez pas le code des autres personnes sans leur donner une idée de ce que "n'a pas fonctionné" signifie. Si vous avez un problème avec le code, laissez un commentaire, vous ne le modifiez pas. Je ne sais pas pourquoi votre édition a travaillé et l'original "N'a pas travaillé" mais Je n'écrirais jamais de code comme celui-là .


Vous avez raison Aaron, en regardant de la sorte, c'était très impoli et je serais sûrement très ennuyé si j'étais aussi vous aussi. Je me suis précipité grand temps et je m'excuse. Donc, au point que j'essayais de faire sans utiliser mes mots, @c n'est pas défini dans votre code, de sorte que cela ne fonctionne pas du tout. Je pense que j'avais atteint un type de structure charret que d'autres langues ont ... Je n'en ai besoin que de la première fonction, mais la deuxième partie est probablement touchée. Merci pour le code, cela m'a sauvé un peu de temps. :)


Je vois que vous l'avez corrigé en éliminant @c. Merci.


@Brian Oui, une fois que vous a expliqué , j'ai compris votre édition. Avant alors je n'ai pas honnêtement pas. Veuillez commencer par des commentaires avant d'éditer le code.


Entendu. ;) Nous sommes tous très protecteurs de notre travail, bien que dans mon cas, tout ce qui soit écrit aussi loin que 2012, j'aimerais pouvoir effacer entièrement parce que j'ai tellement appris depuis que ... j'imagine que ce sera toujours aussi. Je m'excuse à nouveau d'être indélicates. Merci.



2
votes

Je sais que c'est un vieux fil, mais toujours, pourrait être pratique pour les autres. Voici un rapide et sale (que j'ai fait inversement - dépouiller les non-numériques) - en utilisant un CTE récursif. Ce qui rend celui-ci agréable pour moi, c'est que c'est une fonction inline - se déplace donc autour de l'effet Nasty Rbar des fonctions habituelles du scalaire et de la table. Ajustez votre filtre selon que nécessaire pour inclure ou exclure tous les types de caractères.

        Create Function fncV1_iStripAlphasFromData (
            @iString Varchar(max)
        )
        Returns 
        Table With Schemabinding
        As

            Return(

                with RawData as
                (
                    Select @iString as iString
                )
                ,
                Anchor as
                (

                    Select Case(IsNumeric (substring(iString, 1, 1))) when 1 then substring(iString, 1, 1) else '' End as oString, 2 as CharPos from RawData
                    UNION ALL
                    Select a.oString + Case(IsNumeric (substring(@iString, a.CharPos, 1))) when 1 then substring(@iString, a.CharPos, 1) else '' End, a.CharPos + 1
                    from RawData r
                    Inner Join Anchor a on a.CharPos <= len(rtrim(ltrim(@iString)))

                )

                Select top 1 oString from Anchor order by CharPos Desc

            )

Go

select * from dbo.fncV1_iStripAlphasFromData ('00000')
select * from dbo.fncV1_iStripAlphasFromData ('00A00')
select * from dbo.fncV1_iStripAlphasFromData ('12345ABC6789!&*0')


0 commentaires