[RESOLVIDO] Query utilizando WHERE IN com VARCHAR

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)
;