AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 137200
Accepted
GWR
GWR
Asked: 2016-05-03 04:12:13 +0800 CST2016-05-03 04:12:13 +0800 CST 2016-05-03 04:12:13 +0800 CST

Aparar espaços em branco à direita, tabulação, nova linha, retornos de carro, etc.

  • 772

Estou trabalhando com o SQL Server 2008 e estou procurando uma função como ltrime rtrimque também remova guias iniciais e finais, espaços duplos, retornos de carro, alimentações de linha, etc.

Existem várias funções por aí, mas todas as que encontrei têm limitações, por exemplo, truncar a string para 8.000 caracteres. por exemplo (de acordo com alguns dos comentários):

SQL SERVER – 2008 – Função TRIM() aprimorada – Remover espaços à direita, espaços iniciais, espaço em branco, tabulações, retornos de carro, feeds de linha

Um dos comentários propôs uma solução melhor, mas - 1causa um incorrect syntaxerro e não sei por quê.

CREATE FUNCTION dbo.SuperTrimLeft(@str varchar(MAX)) RETURNS varchar(MAX)
    AS
    BEGIN
    IF (ASCII(LEFT(@str, 1)) < 33) BEGIN
        SET @str = STUFF(@str, 1, PATINDEX('%[^'+CHAR(0)+'-'+CHAR(32)+']%', @str) – 1, ' ');
    END;

    RETURN @str;
END;

Então, minha pergunta é: qual é a melhor abordagem para realizar a tarefa acima?

sql-server functions
  • 4 4 respostas
  • 10350 Views

4 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2016-05-03T04:39:26+08:002016-05-03T04:39:26+08:00

    A melhor maneira provavelmente seria criar uma função CLR e usar bibliotecas .NET Framework.

    Uma tentativa de TSQL está abaixo.

    DECLARE @Pattern NVARCHAR (50) = N'%[^' + 
    /*List from http://stackoverflow.com/a/18169122/73226 */
    NCHAR(0x0009) +  /*tab*/
    NCHAR(0x000A) +  /*line feed*/
    NCHAR(0x000B) +  /*line tabulation*/
    NCHAR(0x000C) +  /*form feed*/
    NCHAR(0x000D) +  /*carriage return*/
    /*Various spaces from https://www.cs.tut.fi/~jkorpela/chars/spaces.html */
    NCHAR(0x0020) +  
    NCHAR(0x00A0) +  
    NCHAR(0x1680) +  
    NCHAR(0x180E) +  
    NCHAR(0x2000) +  
    NCHAR(0x2001) +  
    NCHAR(0x2002) +  
    NCHAR(0x2003) +  
    NCHAR(0x2004) +  
    NCHAR(0x2005) +  
    NCHAR(0x2006) +  
    NCHAR(0x2007) +  
    NCHAR(0x2008) +  
    NCHAR(0x2009) +  
    NCHAR(0x200A) +  
    NCHAR(0x200B) +  
    NCHAR(0x202F) +  
    NCHAR(0x205F) +  
    NCHAR(0x3000) +  
    NCHAR(0xFEFF) +
    N']%' COLLATE Latin1_General_100_BIN2;
    
    WITH T(String) AS
    (
    SELECT '         leading only' union all
    SELECT '
    
    Line breaks
    
    ' union all
    SELECT '    tab and space    ' union all
    SELECT '' 
    )
    SELECT '[' + SUBSTRING(String,Start,len(String + '..') - Start - Finish) + ']'
    FROM T
    CROSS APPLY
    (
    SELECT  PATINDEX(@Pattern,String),
            PATINDEX(@Pattern,REVERSE(String))
    )ca(Start, Finish)
    

    Os delimitadores [e ]são aplicados apenas para facilitar a verificação de que não há espaço em branco escondido ali. Remova-os quando estiver satisfeito, este é o caso.

    • 6
  2. Tom V
    2016-05-03T04:48:36+08:002016-05-03T04:48:36+08:00

    Um dos comentários propôs uma solução melhor, mas o -1 causa um erro de sintaxe incorreto e não sei por quê.

    Porque você copiou e colou do site e a página não mostra um hífen/menos, mas um traço .

    Você pode simplesmente posicionar o cursor atrás dele e excluí-lo, digitar menos no teclado e o código funcionará.

    Se você deseja modificar o código dos comentários para também executar o cenário de corte correto, pode fazer como o artigo e criar uma função que apenas inverte a string duas vezes (código copiado do artigo, mas alterado para usar SuperTrimLeft).

    CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
    AS
    BEGIN
    DECLARE @trimchars VARCHAR(10)
    SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
    IF @str LIKE '%[' + @trimchars + ']'
    SET @str = REVERSE(dbo.SuperTrimLeft(REVERSE(@str)))
    RETURN @str
    END
    GO
    CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
    AS
    BEGIN
    RETURN dbo.SuperTrimLeft(dbo.RTrimX(@str))
    END
    GO
    
    • 4
  3. Gordon Bell
    2016-05-04T09:23:54+08:002016-05-04T09:23:54+08:00

    As duas respostas dadas até agora envolvem pelo menos uma inversão da corda para atacar o lado direito.

    Este método não.

    CREATE FUNCTION dbo.LTrimWhitespace(@Input VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @Output VARCHAR(MAX)
        DECLARE @Whitespace VARCHAR(20)
        DECLARE @Pos INT
    
        SET @Whitespace = CHAR(0) + CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32)
        SET @Pos = 1
    
        WHILE CHARINDEX(SUBSTRING(@Input, @Pos, 1), @Whitespace) > 0
        BEGIN
            SET @Pos = @Pos + 1
        END
    
        SET @Output = RIGHT(@Input, LEN(@Input) - @Pos + 1)
    
        RETURN @Output
    END
    
    CREATE FUNCTION dbo.RTrimWhitespace(@Input VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @Output VARCHAR(MAX)
        DECLARE @Whitespace VARCHAR(20)
        DECLARE @Pos INT
    
        SET @Whitespace = CHAR(0) + CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32)
        SET @Pos = LEN(@Input)
    
        WHILE CHARINDEX(SUBSTRING(@Input, @Pos, 1), @Whitespace) > 0
        BEGIN
            SET @Pos = @Pos - 1
        END
    
        SET @Output = LEFT(@Input, @Pos)
    
        RETURN @Output
    END
    
    • 4
  4. JBress
    2022-03-31T22:38:05+08:002022-03-31T22:38:05+08:00

    A resposta aceita não lida com strings contendo apenas caracteres de quebra de linha.

    Aqui está uma função que lida com isso adequadamente, com base na solução de Martin.

    -- Based on https://dba.stackexchange.com/questions/137200/trim-trailing-whitespace-tab-newline-carriage-returns-etc/137203#137203
    CREATE OR ALTER FUNCTION [dbo].[ufn_trim]
    (
        @text nvarchar(max)
    )
    RETURNS nvarchar(max)
    AS
    BEGIN
    
        DECLARE @pattern nvarchar(50) = 
            N'%[^'
    
            -- common white space
            + nchar(0x0009) -- tab
            + nchar(0x000a) -- line feed (lf)
            + nchar(0x000b) -- line tabulation
            + nchar(0x000c) -- form feed
            + nchar(0x000d) -- carriage return (cr)
            + nchar(0x0020) -- space (sp)
            + nchar(0x00a0) -- no-break space (nbsp)
    
            -- uncommon spaces
            --+ nchar(0x1680) -- ogham space mark
            --+ nchar(0x180e) -- mongolian vowel separator (mvs)
            --+ nchar(0x2000) -- en quad
            --+ nchar(0x2001) -- em quad
            --+ nchar(0x2002) -- en space
            --+ nchar(0x2003) -- em space
            --+ nchar(0x2004) -- three-per-em space
            --+ nchar(0x2005) -- four-per-em space
            --+ nchar(0x2006) -- six-per-em space
            --+ nchar(0x2007) -- figure space
            --+ nchar(0x2008) -- punctuation space
            --+ nchar(0x2009) -- thin space
            --+ nchar(0x200a) -- hair space
            --+ nchar(0x202f) -- narrow no-break space (nnbsp)
            --+ nchar(0x205f) -- medium mathematical space (mmsp)
            --+ nchar(0x3000) -- ideographic space
    
            + N']%' COLLATE latin1_general_100_bin2
        ;
    
        DECLARE 
            @start int = PATINDEX(@pattern, @text),
            @end int = PATINDEX(@pattern, REVERSE(@text))
            ;
    
        IF @start = 0
        BEGIN
            -- the string doesn't contain any non-space character
            RETURN '';
        END
    
        RETURN SUBSTRING(@text, @start, LEN(@text + '..') - @start - @end);
    END
    GO
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve