Opa,
Tenho uma coluna com o seguinte valor: “4,15,43”.
Esses valores são os ids de outra tabela.
Existe a possibilidade de montar um SELECT utilizando WHERE IN através desses valores?
Estou utilizando MySQL 4, portanto n há como utilizar subquerys.
SELECT
t1.coluna_a, t1.coluna_b
FROM
tabela1 t1,
tabela2 t2
WHERE
t1.coluna_a IN (t2.coluna_x)
AND t2.coluna_a = 1234
;
Tentei fazer, mas o MySQL interpreta o valor como sendo uma única string, e nao um conjunto de strings.
Valeuu…
Você está usando JPA/Hibernate? Se sim aqui mostra como fazer: JPA Consultas e Dicas.
Você está usando JDBC na unha? Mostra teu código aí.
Opa…
É um SQL puro cara, utilizo ele em um Webservice com JDBC.
Vou exemplificar a parada de forma ficticia…
Possuo duas tabelas:
- contas (tabela em que busco código e nome do tipo de conta)
- clientes (tabela que possui uma coluna com os tipos de conta do cliente)
A coluna, presente na tabela cliente, possui os valores neste formato: “;4;56;3224;52;”.
Utilizo REPLACE e TRIM para transforma em: “4,56,3224,52”.
Seria ideal se conseguisse utilizar esse ultimo valor dentro da clausula IN no SELECT que faz o JOIN com a outra tabela.
O problema é que ao utilizar, o MySQL interpreta como uma única string, e não várias strings divididas por “,”.
Já passou por algo semelhante?
Obviamente existem diversas outras soluções, mas eu realmente queria fazer isso em um único SELECT pois o processamento é meio lento…
Pq vc não utiliza o split, quebrando sua string por “,” e depois passa o lista de strings no IN
SELECT
t1.coluna_a, t1.coluna_b
FROM
tabela1 t1,
tabela2 t2
WHERE
t1.coluna_a IN (SELECT tcol.coluna_x
FROM tabela2 tcol)
AND t2.coluna_a = 1234;
Não resolve?
Opa…
No MySQL 4 n tem SPLIT e n pode ser utilizada subquery.
Até o momento a solução foi mandar 2 querys msmo.
Se alguém conseguir algo melhor, ficaria grato.
Caro Bruno,
Procure por find_in_set
Abraços.
_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL
Fabiano Abreu, valeu a força! Simples e direto.
Segue solução:
select
t1.codigo, t1.nome
from
tabela1 t1,
tabela2 t2
where
t2.codigo = 1234
AND FIND_IN_SET(t1.codigo, REPLACE(TRIM(BOTH ';' FROM t2.campo_x), ';', ','))
;
// ou, caso n haja necessidade do REPLACE e TRIM
select
t1.codigo, t1.nome
from
tabela1 t1,
tabela2 t2
where
t2.codigo = 1234
AND FIND_IN_SET(t1.codigo, t2.campo_x)
;