Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Consultar dentro de valores separados por comas

1 view
Skip to first unread message

DT

unread,
Nov 19, 2009, 9:02:14 AM11/19/09
to
Hola a todos.
Tengo lo siguiente:

ID Nombre Atributos
1 Carlos -1,0,1,2
2 Pepita -1,2,5,12
3 Ma�a 0,2
4 Carlos --

Los atributos son separados por comas, estos no se repiten , van de -1 hasta
15, una persona puede no tener atributos.
Lo que necesito es una selecci�n que diga algo as�:
Mostrar los nombres de todos los que pos�en el atributo 2 y el atributo 12

Muchas gracias por su valiosa ayuda.
SQL Server 2005.

Ruben Garrigos

unread,
Nov 19, 2009, 9:28:13 AM11/19/09
to
Hola DT,

Antes que nada te recomendar�a que no almacenaras los datos desnormalizados
separados por comas. Para hacer la b�squeda de aquellos que tienen el atributo
2 y 12 podr�as hacer algo como esto:

select nombre from tabla where
','+atributos+',' like '%,2,%' and
','+atributos+',' like '%,12,%'

Como ves, una soluci�n sucia, poco mantenible, no indexable, etc. Mala idea
almacenar los atributos de esta forma... :(

Un saludo,

Rub�n Garrig�s
Solid Quality Mentors

Blog: http://blogs.solidq.com/es/elrincondeldba

Alejandro Mesa

unread,
Nov 19, 2009, 10:15:01 AM11/19/09
to
Trata:

USE tempdb;
GO
DECLARE @t1 TABLE (
ID int NOT NULL UNIQUE,
Nombre varchar(50),
Atributos varchar(50)
);

DECLARE @t2 TABLE (Atributo varchar(5) NOT NULL UNIQUE);

INSERT INTO @t1 VALUES(1, 'Carlos', '-1,0,1,2');
INSERT INTO @t1 VALUES(2, 'Pepita', ' -1,2,5,12');
INSERT INTO @t1 VALUES(3, 'Maa', '0,2');

INSERT INTO @t2 VALUES('2');
INSERT INTO @t2 VALUES('12');

SELECT
T1.ID, MIN(T1.Nombre) AS [Nombre], MIN(T1.Atributos) AS [Atributos]
FROM
@t1 AS T1
INNER JOIN
@t2 AS T2
ON ',' + T1.Atributos + ',' LIKE '%,' + T2.Atributo + ',%'
GROUP BY
T1.ID
HAVING
COUNT(DISTINCT T2.Atributo) = (SELECT COUNT(*) FROM @t2);
GO

Aqui tienes una explicacion de la operacion "division relacional" que he
usado para resolver este problema.

Relational Division
http://www.dbazine.com/ofinterest/oi-articles/celko1

Hubiese sido mucho mas practico si en vez de tener una lista de atributos,
tuvieses una tabla o relacion para almacenar los atributos relacionados con
un [ID].

create table dbo.Persona_Atributo (
PersonaID int not null,
AtributoID char(2) not null,
constraint PK_Persona_Atributo primary key (PersonaID, AtributoID),
constraint FK_Persona_Atributo_Persona foreign key (PersonaID) references
dbo.Persona(PersonaID),
constraint FK_Persona_Atributo_Atributo foreign key (AtributoID) references
dbo.Atributo(AtributoID)
);
GO

insert into dbo.Persona_Atributo values(1, '-1');
insert into dbo.Persona_Atributo values(1, '0');
insert into dbo.Persona_Atributo values(1, '1');
insert into dbo.Persona_Atributo values(1, '2');
...


AMB

"DT" wrote:

> Hola a todos.
> Tengo lo siguiente:
>
> ID Nombre Atributos
> 1 Carlos -1,0,1,2
> 2 Pepita -1,2,5,12

> 3 Maa 0,2


> 4 Carlos --
>
> Los atributos son separados por comas, estos no se repiten , van de -1 hasta
> 15, una persona puede no tener atributos.

> Lo que necesito es una seleccin que diga algo as:
> Mostrar los nombres de todos los que posen el atributo 2 y el atributo 12

DT

unread,
Nov 19, 2009, 10:39:06 AM11/19/09
to
Gracias!
Mi objetivo es cambiar esta estructura en una relacional, para ello necesito
separar alunos atributos ya cadudos.
Esto me sirve!!

Muchas gracias.


"Alejandro Mesa" <Alejan...@discussions.microsoft.com> wrote in message
news:44B675D4-0798-4420...@microsoft.com...

0 new messages