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 / 248830
Accepted
donutguy640
donutguy640
Asked: 2019-09-16 13:22:48 +0800 CST2019-09-16 13:22:48 +0800 CST 2019-09-16 13:22:48 +0800 CST

MySQL - Como verificar um valor em todas as colunas

  • 772

Estou curioso, existe uma boa maneira de pesquisar todas as colunas por um determinado valor? Para meus propósitos, não precisa ser nada rápido, é apenas um tipo de coisa 1-off, e eu realmente não quero ter que digitar cada nome de campo. Isso é precisamente o que vou fazer agora, mas acho que certamente há uma maneira melhor.

Eu gostaria de virar isso:

SELECT * FROM table WHERE col1 = 'val' OR col2 = 'val' OR col3 = 'val';

nisso:

SELECT * FROM table WHERE * = 'val'

...ou, melhor ainda (embora eu duvide seriamente...)

SELECT * FROM table WHERE * like '%val%'

Eu encontrei isso , que parece meio não muito próximo, mas não estou encontrando nada mais próximo:

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)

A diferença é que pesquisa uma seleção de colunas para os valores especificados, enquanto estou tentando pesquisar TODAS as colunas por um único valor.

Não é importante, porém, como eu disse mais do que tudo, estou apenas curioso

mysql
  • 7 7 respostas
  • 72272 Views

7 respostas

  • Voted
  1. Bill Karwin
    2019-09-16T14:28:37+08:002019-09-16T14:28:37+08:00

    O SQL não fornece uma boa maneira de fazer isso porque provavelmente não é um bom design de tabela ter N colunas que possam ter valores no mesmo domínio. Este é potencialmente um caso de "grupos repetidos", como se você tivesse colunas phone1, phone2, phone3, ... phoneN.

    Se você tiver várias colunas que tenham o mesmo domínio lógico de valores, pode ser um caso em que seja um atributo de vários valores (como o exemplo de telefones). A maneira padrão de armazenar atributos de vários valores é como várias linhas em outra tabela, com uma referência à linha a que pertencem na tabela primária.

    Se fizer isso, você só precisa procurar o valor específico em uma coluna da tabela dependente.

    SELECT t.* FROM mytable AS t
    JOIN phones AS p ON t.primaryKey = p.refKey 
    WHERE p.phone = ?
    
    • 26
  2. ypercubeᵀᴹ
    2019-09-16T13:28:10+08:002019-09-16T13:28:10+08:00

    O mais próximo que você pode chegar é isso, usando IN:

    SELECT * FROM table WHERE 'val' IN (col1, col2, ..., colN) ;
    

    Você ainda precisa escrever todas as colunas que deseja verificar.
    E não é diferente da ORexpressão que você tem, nem na performance ou de outra forma. Esta é apenas uma maneira diferente e equivalente de escrever a expressão, com um pouco menos de caracteres.

    • 20
  3. Lennart - Slava Ukraini
    2019-09-17T06:17:57+08:002019-09-17T06:17:57+08:00

    Você precisa fazer isso em duas etapas, primeiro gere o sql como (supondo que sua tabela seja nomeada T no esquema S:

    select concat(' SELECT * FROM t WHERE ''a'' in ('
                 , GROUP_CONCAT(COLUMN_NAME)
                 , ')')
    from INFORMATION_SCHEMA.columns 
    where table_schema = 's' 
      and table_name = 't'
      and DATA_TYPE IN ('char','varchar');
    

    Agora você pode executar esta string. Observe que você deve citar o 'a' com ' extra. Se você colocar isso em um procedimento, por exemplo, você pode preparar e executar a string que foi gerada.

    Testei com:

    create table t (a char(3), b varchar(5), c int);
    insert into t(a,b) values ('a','b'),('b','c'),('c','c');    
    

    A consulta gerada onde:

    SELECT * FROM t WHERE 'a' in (a,b)
    

    e executar isso resulta em:

    a   b   c
    ---------
    a   b   
    
    • 6
  4. Best Answer
    donutguy640
    2020-01-11T15:36:20+08:002020-01-11T15:36:20+08:00

    Parece que já faz um ano desde que perguntei isso, mas acabei de tropeçar no que parece ser exatamente a coisa que eu estava procurando! Não é uma instrução SQL, como eu esperava, mas FAZ o que eu queria.

    No MySQL Workbench, você pode clicar com o botão direito do mouse na tabela ou no esquema e escolher Pesquisar dados da tabela.menu de contexto do esquema

    • 6
  5. jkavalik
    2019-09-18T07:41:48+08:002019-09-18T07:41:48+08:00

    A solução mais simples é fazer

    mysqldump ... --skip-extended-insert db table | grep 'val'
    

    A menos que val seja algo comum na sintaxe SQL.

    Esta é uma maneira válida de encontrar algo se você não souber "onde" está no banco de dados ou na tabela. O grepretornará linhas inteiras (incluindo o nome da tabela) onde o valor está presente. Não é SQL e não é muito útil se você deseja processar a saída programaticamente, mas é simples e bastante rápido.

    Usar mysqldumpe greppode estar longe de ser fácil de usar, e pode parecer muito básico, mas muitas pessoas nem pensarão nisso quando estiverem decididas a encontrar uma solução SQL. Para algumas pessoas, a solução CLI pode ser mais acessível do que, digamos, instalar e conectar o Workbench.

    • 3
  6. Anon0012398193
    2019-09-17T00:00:31+08:002019-09-17T00:00:31+08:00

    Tentar:

    select
        *
    from
        _table_
    where
        concat('.', col1, '.', col2, '.', col3, '.') like "%.search_value.%";
    

    A maneira como isso tenta resolver o problema é criando uma longa string contendo todos os valores de uma determinada linha, separados por um caractere de ponto. em seguida, ele realiza uma pesquisa de string para o termo desejado entre dois pontos.

    Isso pressupõe que não há '.' em sua string de pesquisa. Se você não pode garantir isso, talvez possa usar um "caractere separador" diferente.

    Se você quiser procurar por substrings nas colunas individuais, você pode mover os sinais % para dentro do '.' igual a:

    select
        *
    from
        _table_
    where
        concat('.', col1, '.', col2, '.', col3, '.') like ".%search_value%.";
    
    • 2
  7. Bunns
    2021-01-18T15:53:39+08:002021-01-18T15:53:39+08:00

    Você pode fazer isso facilmente no MySQL, desde que você tenha o índice FULLTEXT configurado em sua tabela. Ele permite que vários mecanismos de pesquisa diferentes sejam usados, incluindo linguagem natural e metadados adicionais para pontuar os resultados.

    Retirado do manual do MySQL :

    mysql> SELECT * FROM articles
            WHERE MATCH (title,body)
            AGAINST ('database' IN NATURAL LANGUAGE MODE);
    +----+-------------------+------------------------------------------+
    | id | title             | body                                     |
    +----+-------------------+------------------------------------------+
    |  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
    |  5 | MySQL vs. YourSQL | In the following database comparison ... |
    +----+-------------------+------------------------------------------+
    2 rows in set (0.00 sec)
    

    Isso só funciona para colunas baseadas em caracteres. Se você estiver procurando por um valor específico em tipos numéricos ou outros tipos especiais, precisará usar o CONCAT ou outros mecanismos para conseguir isso.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

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