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 / 56726
Accepted
Tiago Stapenhorst Martins
Tiago Stapenhorst Martins
Asked: 2014-01-14 20:58:54 +0800 CST2014-01-14 20:58:54 +0800 CST 2014-01-14 20:58:54 +0800 CST

Como mapear palavras semelhantes em camelcase, pascalcase, sublinhado e com pontuação baixa para o mesmo id?

  • 772

Estou trabalhando no PostgreSQL e tenho uma tabela como esta chamada words_table:
Mesa de mesa

Eu preciso de todas as palavras equivalentes (como software_design e software-design) para ter seu valor de mapa = para id_word equivalente de sua palavra. Em outras palavras, quero que todas as palavras softwaredesign, software_design, software.design... e assim por diante tenham o mesmo número na coluna do mapa (neste caso específico, um número de 1 a 10). O mesmo se aplica à engenharia_civil e ao Desenho Industrial.

Eu sei que isso envolve algumas expressões regulares e comparações que não diferenciam maiúsculas de minúsculas, mas estou preso na lógica SQL. Eu sei que essas expressões podem ser úteis:

regexp_replace(word, '(\.|:|,|&|-)','','g')

Para lidar com os separadores

lower(something)

Para lidar com a correspondência de maiúsculas e minúsculas ou

UPDATE words_table SET a.map = b.id_word WHERE word ILIKE something

... WHERE word ~* something

para correspondência insensível a maiúsculas e minúsculas.

Devo criar novas colunas com palavras regexp_replaced e fazer o mapeamento depois disso com algumas junções? Ou talvez algo com CamelCase e correspondência de sublinhado? Talvez funções? Qual é a solução ótima?

postgresql update
  • 3 3 respostas
  • 237 Views

3 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2014-01-15T10:54:20+08:002014-01-15T10:54:20+08:00

    Projeto de banco de dados

    Ou você já tem a tabela de consulta e esqueceu de mencioná-la, ou deve criar uma.

    CREATE TABLE map (
      map_id int PRIMARY KEY
     ,map    text UNIQUE NOT NULL
    );
    
    -- And that's how I would shape your original table:
    CREATE TABLE word (
      word_id serial PRIMARY KEY
     ,map_id  int REFERENCES map(map_id)
     ,word    text
    );
    

    Aqui e aquitext é porque eu normalmente prefiro varchar(n).
    É por isso que coloquei as duas integercolunas primeiro na tabela word.

    INSERT INTO map(map_id, map) VALUES
      (1, softwaredesign)
     ,(2, civilengineering)
     ,(3, industrialdesign)
     , ... ;
    

    dados do mapa

    Defina uma função como @Daniel já sugeriu .

    Dependendo de seus requisitos exatos, eu usaria classes de caracteres predefinidas sempre que possível em uma expressão regular, em vez de lançar minhas próprias. O Postgres usa informações de localidade do seu sistema operacional para identificar caracteres, dígitos, etc.

    [:alnum:]inclui todos os números e dígitos, dependendo da sua localidade. Ao contrário , [a-zA-Z0-9]isso também identifica äou écomo caracteres - dependendo da sua localidade.

    [^[:alnum:]]
    é a negação, ou seja, todos os outros personagens.
    Há também a abreviação de classe\W semelhante , mas isso incluiria o sublinhado _.

    CREATE FUNCTION map_word(text) RETURNS text AS
    $$SELECT lower(regexp_replace($1, '[^[:alnum:]]', '', 'g'))$$
    LANGUAGE sql IMMUTABLE;
    

    Esta atualização seria mais eficiente então:

    UPDATE word w
    SET    map_id = m.map_id
    FROM   map m
    WHERE  m.map = map_word(w.word)
    AND    w.map_id IS DISTINCT FROM m.map_id -- avoid empty updates
    
    • 3
  2. Daniel Vérité
    2014-01-15T05:21:25+08:002014-01-15T05:21:25+08:00

    Você pode dividi-lo em dois problemas menores.

    Primeiro crie uma função que faça a simplificação da palavra. Esta versão apenas remove qualquer caractere não alfanumérico e define o resultado em letras minúsculas. Refine-o, se necessário.

    CREATE FUNCTION simplify(text) RETURNS text AS
    $$ SELECT lower(regexp_replace($1, '[^a-zA-Z0-9]', '', 'g')); $$
    LANGUAGE sql;
    

    Em seguida, atualize a mapcoluna juntando a tabela nela mesma, combinando cada palavra com sua versão "simplificada".

     UPDATE words_table w 
        set map=w2.id_word
     FROM words_table w2
         WHERE w2.word=simplify(w.word);
    

    Isso pressupõe que qualquer versão simplificada de uma palavra já faz parte da tabela, como parece ser o caso em seus dados de amostra. Caso contrário, eles devem ser inseridos.

    • 2
  3. Kondybas
    2014-01-15T01:09:53+08:002014-01-15T01:09:53+08:00

    Nos pequenos conjuntos de dados, você pode usar funções que calculam derivadas sempre que precisar delas, mas em grandes junções essa função será invocada para cada linha repetidas vezes. Isso pode diminuir o desempenho geral.

    Mais eficiente é armazenar derivadas pré-calculadas. Uma maneira é armazená-los junto com as strings originais, mas você obterá um campo de baixa cardinalidade que precisa ser indexado. A outra abordagem é manter a tabela intermediária de derivadas usadas em junções para colar outras tabelas.

    • 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