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
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.
O mais próximo que você pode chegar é isso, usando
IN
:Você ainda precisa escrever todas as colunas que deseja verificar.
E não é diferente da
OR
expressã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.Você precisa fazer isso em duas etapas, primeiro gere o sql como (supondo que sua tabela seja nomeada T no esquema S:
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:
A consulta gerada onde:
e executar isso resulta em:
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.
A solução mais simples é fazer
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
grep
retornará 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
mysqldump
egrep
pode 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.Tentar:
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:
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 :
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.