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 / 339798
Accepted
fcka
fcka
Asked: 2024-05-26 03:51:30 +0800 CST2024-05-26 03:51:30 +0800 CST 2024-05-26 03:51:30 +0800 CST

Remova espaços e substitua caracteres por regexp_replace()

  • 772

Eu desejo ...

  1. ... remova espaços
  2. ... excluir apóstrofos
  3. ... substitua 'é' e 'è' por 'e'

Eu uso a função regexp_replace().

No momento, posso deletar os espaços, mas mal. Na verdade, quando o atributo contém vários espaços, apenas um é eliminado.

Não consigo processar 1. , 2. e 3. ao mesmo tempo. Isso é possível?

Abaixo está um link para o meu código:

https://dbfiddle.uk/22ODtpNS

postgresql
  • 3 3 respostas
  • 35 Views

3 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2024-05-26T06:38:45+08:002024-05-26T06:38:45+08:00

    Instale o módulo adicional unaccent, que (entre outras coisas) fornece a função de mesmo nome unaccent(). Isto ...

    remove acentos (sinais diacríticos) de uma determinada string

    Então:

    SELECT replace(unaccent(compar), ' ', '')
    FROM   tbl;
    

    replace()remove todas as ocorrências de uma sequência de padrões, não apenas a primeira. Nenhuma mágica regexp é necessária aqui. Veja abaixo.

    Você UPDATEpoderia ser:

    UPDATE tbl
    SET    compar = replace(unaccent(compar), ' ', '')
    WHERE  compar ~ ' ';  -- ignores strings with accents but no spaces (?!)
    

    violino


    Na verdade, quando o atributo contém vários espaços, apenas um é eliminado.

    Você pode modificar o comportamento regexp_replace()adicionando 'g' como quarto parâmetro, como:

    regexp_replace(compar, ' ', '', 'g')
    

    Ver:

    • Regex para remover vários caracteres

    Para o caso simples, essa é apenas uma maneira cara de dizer:

    replace(compar, ' ', '')
    
    • 1
  2. Vérace
    2024-05-26T20:49:21+08:002024-05-26T20:49:21+08:00

    Posso ter ficado um pouco confuso aqui - pensei que a questão era "remover espaços" - acreditei que eram vários espaços que estavam sendo discutidos. De qualquer forma, eu respondi, então aqui está - talvez ajude as pessoas no futuro.

    Solução 1 – remova todas as vírgulas, espaços e acentos.

    De longe, a maneira mais simples de remover todos os espaços e vírgulas, bem como acentos de uma só vez, é usar a TRANSLATE()função (veja violino aqui ).

    SELECT
      TRANSLATE(str, 'áéíóú ,', 'aeiou')
    FROM 
      test;
    

    Esta solução tem uma vantagem - às vezes os funcionários/consultores não têm permissão para instalar extensões ou a instância do PostgreSQL pode ser baseada na nuvem e a UNACCENTextensão não está disponível - caso contrário, a solução do @ErwinBrandstetter tem melhor desempenho, mesmo com um duplo REPLACE()para eliminar as vírgulas:

    EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
    SELECT 
      REPLACE(REPLACE(unaccent(str), ' ', ''), ',', '')
    FROM  test;
    

    Na minha máquina doméstica, criei uma testtabela com 10 milhões de registros e a solução do EB foi consistentemente ~ 25% mais rápida que a TRANSLATE()solução e ~ 40% mais rápida que REGEXP_REPLACE()aquela - os resultados em db<>fiddle normalmente estão alinhados com isso, mas às vezes ( talvez devido a um aumento no uso), isso pode mudar. Os perigos do benchmarking em sistemas onde não se está no controle.

    Solução onde qualquer sequência de espaços é reduzida a 1.

    No entanto, para remover vários espaços - deixando um. Na minha experiência, nunca se deve subestimar o quão estúpidas/preguiçosas/distraídas/entediadas as pessoas podem ser ao inserir texto livre em um aplicativo - por acidente, um telefone é colocado em um teclado e você tem 100 vírgulas em pouco tempo! Certa vez, eu tinha um campo de endereço que dizia (algo como - "Joe encontrará você para um sanduíche mais tarde.")!

    Então, o que fiz foi o seguinte (todo o código abaixo está disponível no violino aqui ):

    CREATE TABLE test
    (
      id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
      str TEXT NULL
    );
    

    Preencha-o com algumas strings:

    INSERT INTO test (str) VALUES
    
    ('A normal string'),     -- No commas, starts with a letter, unaccented
    ('    first  ,  second   ,     third   '), -- starts with spaces, commas, more spaces, no accents
    (',,,  A Náid ,,,   ,,,      ,    a h-Aon    , ,,, a Dó ,,,,   A Trí   ,  ' );
    
    -- the last string has commas, accents and spaces all over the place
    

    Agora, se você não pode e/ou não tem permissão para instalar extensões do PostgreSQL, você pode fazer o seguinte usando a função REPLACE( manual ):

    SELECT
      REPLACE
      (
        REPLACE
        (
          REPLACE(str, 'á', 'a'), 
          'í', 'i'
        ), 'ó', 'o' 
      )  -- &c. for all the accents in your languages
      str
    FROM 
      test;
    

    Resultado (para a string acentuada):

    A Naid ,,,   ,,,      ,    a h-Aon    , ,,, a Do ,,,,   A Tri
    

    Os acentos desapareceram - nem é preciso dizer que isso é propenso a erros e cansativo. É muito melhor usar a UNNACCENTextensão - de qualquer maneira, ela faz parte dos módulos de contribuição - isso é quase "essencial"!

    Então o seguinte código é executado:

    SELECT
      REGEXP_REPLACE 
      (
        BTRIM(REPLACE(UNACCENT(str), ',', '')), 
        '[ ]{2,}', ' ', 'g'
      ),
    
      LENGTH(
        REGEXP_REPLACE 
      (
        BTRIM(REPLACE(UNACCENT(str), ',', '')), 
        '[ ]{2,}', ' ', 'g'
      ))
    FROM
      test;
    

    A razão pela qual o REGEXP_REPLACE()tem que ser executado é porque pode haver mais de um espaço (pode ser 2, 3 ou mais) em sequência (lembre-se das observações sobre a entrada de texto livre acima). A BTRIM()função remove quaisquer caracteres de espaço antes ou depois das strings - a LENGTH()função é usada apenas para verificar os resultados.

    regexp_replace              length
    A normal string                 15
    first second third              18
    A Naid a h-Aon a Do A Tri       25
    

    O padrão regexp explicado:

    • [ ]- os colchetes indicam uma classe de caracteres - neste caso, contém apenas o caractere de espaço

    • {2,}', ' 'é o quantificador e a substituição - isso significa REGEXP_REPLACE()substituir 2 ou mais caracteres de espaço por um único espaço

    • 'g'especifica a opção global - faça isso em toda a string

    No violino (não mostrado por questões de brevidade), costumava REPLACE()remover espaços suplementares, mas não funciona corretamente como pode ser visto nas próprias strings (entre as palavras) e nos comprimentos.

    Existe outra maneira de fazer isso (um pouco artificial - mas útil para ver algumas das outras funcionalidades do PostgreSQL):

    WITH change1 AS 
    (
      SELECT
        id,
        REGEXP_SPLIT_TO_TABLE
        (
          REPLACE(UNACCENT(BTRIM(str)), ',', ''), ' '
        ) AS str1
      FROM
        test
     
    )
    SELECT
      id,
      STRING_AGG(str1, ' ' ORDER BY id),
      LENGTH(STRING_AGG(str1, ' ' ORDER BY id))
    FROM change1
    WHERE 
      LENGTH(str1) >= 1
    GROUP BY id
    ORDER BY id;
    

    Resultado - o mesmo.

    As duas funções interessantes aqui são REGEXP_SPLIT_TO_TABLE()e STRING_AGG(). Tente desmontar a consulta e ver como tudo se encaixa.

    A partir da análise de desempenho que fiz, parece que a primeira consulta é (sem surpresa) mais rápida que a segunda (mais longa) - mas YMMV - teste em seus próprios sistemas e dados. As advertências usuais sobre testar o desempenho em um sistema com apenas 3 registros e sobre o qual você não tem controle em nenhum momento se aplicam aqui.

    • 1
  3. fcka
    2024-05-27T04:30:28+08:002024-05-27T04:30:28+08:00

    para o apóstrofo:

    select replace (compar,CHR(39),'_') dans my_table ;
    

    funciona

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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