Como você pode remover todos os caracteres que não são alfabéticos de uma string?
E quanto a não alfanuméricos?
Isso precisa ser uma função personalizada ou também existem soluções mais generalizáveis?
Como você pode remover todos os caracteres que não são alfabéticos de uma string?
E quanto a não alfanuméricos?
Isso precisa ser uma função personalizada ou também existem soluções mais generalizáveis?
Tente esta função:
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
Chame assim:
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl')
Depois de entender o código, você deve ver que é relativamente simples alterá-lo para remover outros caracteres também. Você pode até tornar isso dinâmico o suficiente para transmitir seu padrão de pesquisa.
Espero que ajude.
Versão parametrizada do G Mastros ' resposta incrível :
Apenas alfabético:
Apenas numérico:
Apenas alfanumérico:
Não alfanumérico:
fonte
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
que ainda retira os espaços em branco. Eu também tentei usar,[[:blank:]]
mas isso interrompe a função e nada é removido da string. O mais próximo que eu cheguei é usando:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(codificação embutida de um espaço no padrão regex). No entanto, isso não remove as quebras de linha.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Acredite ou não, no meu sistema essa função feia tem melhor desempenho do que a elegante G Mastros.
fonte
ASCII
inteiro aqui e comparar diretamente a saída deSUBSTRING
com alguns caracteres, por exemplo:SET @ch=SUBSTRING(@s, @p, 1)
eIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Eu sabia que o SQL era ruim na manipulação de strings, mas não achei que seria tão difícil. Aqui está uma função simples para remover todos os números de uma string. Haveria maneiras melhores de fazer isso, mas isso é um começo.
Resultado
Rodada 2 - Lista negra orientada por dados
Resultado
Meu desafio para os leitores: você pode tornar isso mais eficiente? Que tal usar recursão?
fonte
Se você é como eu e não tem acesso apenas para adicionar funções aos dados de produção, mas ainda deseja executar esse tipo de filtragem, aqui está uma solução SQL pura usando uma tabela PIVOT para reunir novamente as peças filtradas.
NB : codifiquei a tabela com até 40 caracteres, você precisará adicionar mais se tiver mais seqüências para filtrar.
fonte
Tendo analisado todas as soluções fornecidas, pensei que deveria haver um método SQL puro que não requer uma função ou uma consulta CTE / XML e não envolve dificuldade em manter instruções REPLACE aninhadas. Aqui está a minha solução:
A vantagem de fazer isso dessa maneira é que os caracteres válidos estão contidos em uma sequência na subconsulta, facilitando a reconfiguração para um conjunto diferente de caracteres.
A desvantagem é que você precisa adicionar uma linha de SQL para cada caractere até o tamanho da sua coluna. Para facilitar essa tarefa, usei o script Powershell abaixo, neste exemplo, para um VARCHAR (64):
fonte
Aqui está outra maneira de remover caracteres não alfabéticos usando um
iTVF
. Primeiro, você precisa de um divisor de string baseado em padrão. Aqui está um artigo do artigo de Dwain Camp :Agora que você possui um divisor baseado em padrão, é necessário dividir as strings que correspondem ao padrão:
e concatená-los de volta para obter o resultado desejado:
AMOSTRA
Resultado:
fonte
Essa solução, inspirada na solução do Sr. Allen, requer uma
Numbers
tabela de números inteiros (que você deve ter em mãos se quiser executar operações de consulta sérias com bom desempenho). Não requer um CTE. Você pode alterar aNOT IN (...)
expressão para excluir caracteres específicos ou alterá-la para uma expressãoIN (...)
ORLIKE
para reter apenas determinados caracteres.fonte
Aqui está uma solução que não requer a criação de uma função ou a listagem de todas as instâncias de caracteres a serem substituídas. Ele usa uma instrução WITH recursiva em combinação com um PATINDEX para encontrar caracteres indesejados. Ele substituirá todos os caracteres indesejados em uma coluna - até 100 caracteres inválidos únicos contidos em qualquer sequência. (EG "ABC123DEF234" conteria 4 caracteres inválidos 1, 2, 3 e 4) O limite de 100 é o número máximo de recursões permitidas em uma instrução WITH, mas isso não impõe um limite no número de linhas a serem processadas, o que é limitado apenas pela memória disponível.
Se você não deseja resultados DISTINCT, pode remover as duas opções do código.
fonte
Coloquei isso nos dois lugares em que PatIndex é chamado.
para a função personalizada acima RemoveNonAlphaCharacters e renomeou-a RemoveNonAlphaNumericCharacters
fonte
--Primeiro crie uma função
Agora chame essa função como
Seu resultado como
fonte
Do ponto de vista de desempenho, eu usaria a função embutida:
fonte
Aqui está outra solução CTE recursiva, baseada na resposta de @Gerhard Weiss aqui . Você deve copiar e colar todo o bloco de código no SSMS e brincar com ele lá. Os resultados incluem algumas colunas extras para nos ajudar a entender o que está acontecendo. Demorei um pouco até entender tudo o que estava acontecendo com o PATINDEX (RegEx) e o CTE recursivo.
fonte
Usando uma tabela de números gerados em CTE para examinar cada caractere, FOR XML para concat com uma cadeia de valores mantidos, você pode ...
fonte
fonte
Dessa forma, não funcionou para mim, pois estava tentando manter as letras árabes. Tentei substituir a expressão regular, mas também não funcionou. Eu escrevi outro método para trabalhar no nível ASCII, pois era minha única opção e funcionava.
IR
fonte
Embora o post seja um pouco antigo, gostaria de dizer o seguinte. O problema que tive com a solução acima é que ele não filtra caracteres como ç, ë, ï etc. Adaptei uma função da seguinte maneira (usei apenas uma string varchar 80 para economizar memória):
fonte
Acabei de encontrar isso embutido no Oracle 10g, se é isso que você está usando. Eu tive que retirar todos os caracteres especiais para comparar o número de telefone.
fonte