Consultar dentro de valores separados por comas

19/11/2009 - 15:02 por DT | Informe spam
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.

Preguntas similare

Leer las respuestas

#1 Ruben Garrigos
19/11/2009 - 15:28 | Informe spam
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

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
Respuesta Responder a este mensaje
#2 Alejandro Mesa
19/11/2009 - 16:15 | Informe spam
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/o...les/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

Muchas gracias por su valiosa ayuda.
SQL Server 2005.

Respuesta Responder a este mensaje
#3 DT
19/11/2009 - 16:39 | Informe spam
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" wrote in message
news:
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/o...les/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

Muchas gracias por su valiosa ayuda.
SQL Server 2005.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida