Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Buscar dato en cadena Separada por Comas

Estas en el tema de Buscar dato en cadena Separada por Comas en el foro de SQL Server en Foros del Web. estoy haciendo una consulta a una bd de sql server..a un campo llamado PAYTYPE, en ese campo estoy buscando que me muestre todos los registro ...
  #1 (permalink)  
Antiguo 26/07/2012, 12:11
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Buscar dato en cadena Separada por Comas

estoy haciendo una consulta a una bd de sql server..a un campo llamado PAYTYPE, en ese campo estoy buscando que me muestre todos los registro que tienen un numero 2, este campo esta separado por comas EJEMPLO (2 ;1;;;), al mismo tiempo en otro campo llamado PAYAMT me busca la primera cifra separada por comas correspondiente al mismo registro (20;-60;0;0;0 )


ejemplo:

paytype (2 ;1;;;)
Payamt (20;-60;0;0;0 )
Resultado: 20

El problema es cuando el No. 2 del campo PAYTYPE NO ESTA EN EL PRIMER REGISTRO

ejemplo:

paytype (1 ;2;;;)
Payamt (20;-60;0;0;0 )
EL RESULTADO TENDRIA QUE SER
Resultado: -60

pero sigo obteniendo el 20, es decir no se como recorrer la busqueda del campo dependiendo de la ubicacion del campo no 2...espero haberme explicado..anexo el codigo que tengo..el cual hace el primer ejemplo pero no me cumple con la segunda condicion...gracias por sus respuestas


SELECT distinct tnum,type,
substring(PAYAMT, 1, charindex(';', payamt)-1) payamt,
substring(payamt, charindex(';', payamt)+1, len(PAYAMT)) payamt
FROM sales2 WHERE (([PAYTYPE] LIKE '%' + '2' + '%')) AND ([IDATE] >= @idate) AND ([IDATE] <= @idate2)
  #2 (permalink)  
Antiguo 26/07/2012, 12:30
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Buscar dato en cadena Separada por Comas

Este es un caso real para la araña.......
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 26/07/2012, 12:38
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Eso fue una broma..?
  #4 (permalink)  
Antiguo 26/07/2012, 12:52
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

pues probe tu query y regresa esto:

Código SQL:
Ver original
  1. SELECT
  2. SUBSTRING('20;-60;0;0;0', 1, charindex(';','20;-60;0;0;0')-1) payamt,
  3. SUBSTRING('20;-60;0;0;0', charindex(';','20;-60;0;0;0')+1, len('20;-60;0;0;0')) payamt

payamt 20
payamt -60;0;0;0 que es lo que quieres no??

o quieres que nada mas regrese el -60? si es asi:


Código SQL:
Ver original
  1. SELECT payamt1, payamt2, SUBSTRING(payamt2,1,charindex(';',payamt2)-1) AS payamt3
  2. FROM(
  3. SELECT
  4. SUBSTRING('20;-60;0;0;0', 1, charindex(';','20;-60;0;0;0')-1) payamt1,
  5. SUBSTRING('20;-60;0;0;0', charindex(';','20;-60;0;0;0')+1, len('20;-60;0;0;0')) payamt2
  6. ) t1

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 26/07/2012, 13:01
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Aqui la cosa es q...dependiendo de la ubicacion del valor No.2 me debe seleccionar el valor correspondiente a ese no 2 en el otro campo>


ejemplo:

paytype (2 ;1;;;)
Payamt (20;-60;0;0;0 )
Resultado: 20

El problema es cuando el No. 2 del campo PAYTYPE NO ESTA EN EL PRIMER REGISTRO

ejemplo:

paytype (1 ;2;;;)
Payamt (20;-60;0;0;0 )
EL RESULTADO TENDRIA QUE SER
Resultado: -60


como te comento en el codigo q puse ahi , me cumple la primera condicion, pero no la segunda..gracias por tus respuestas..
  #6 (permalink)  
Antiguo 26/07/2012, 14:30
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Buscar dato en cadena Separada por Comas

Exacto Mr. Libras, DEPENDIENDO de la posicion del 2, debe tomar de la otra cadena, de la misma posicion el dato.

Por eso no fue una broma, es un caso para la araña
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 26/07/2012, 14:33
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Buscar dato en cadena Separada por Comas

No tengo codigo para proporcionarte, solamente algunas pistas..

La primera tarea- extraer el segundo numero de paytype (2 ;1;;;) (=1) o de paytype (1 ;2;;;) (=2) es la mas facil de los dos, y utilizando CharIndex & Substring (como Libras te sugerio) debe ser suficiente.

La segunda tarea- extraer de Payamt (20;-60;0;0;0) el primer numero o el segundo o el decimo - es la mas complicada.
En este caso debes dividir la cadena en un conjunto de valores, o utilizar una tabla de numeros.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 26/07/2012, 14:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

ps el caso para la araña lo resolvemos con esto :)

Código SQL:
Ver original
  1. CREATE FUNCTION [dbo].[SplitApplication](@applicationid VARCHAR(2000))  
  2.    
  3. RETURNS @RtnValue TABLE  
  4. (  
  5. Id INT IDENTITY(1,1),  
  6. DATA nvarchar(100)  
  7. )  
  8. AS  
  9. BEGIN  
  10. DECLARE @Cnt INT, @SplitOn nvarchar(5)  
  11. SET @SplitOn = ';'  
  12. SET @Cnt = 1  
  13.  
  14. While (Charindex(@SplitOn,@applicationid)>0)  
  15. BEGIN  
  16. INSERT INTO @RtnValue (DATA)  
  17. SELECT  
  18. DATA = ltrim(rtrim(SUBSTRING(@applicationid,1,Charindex(@SplitOn,@applicationid)-1)))  
  19.  
  20. SET @applicationid = SUBSTRING(@applicationid,Charindex(@SplitOn,@applicationid)+1,len(@applicationid))  
  21. SET @Cnt = @Cnt + 1  
  22. END  
  23.  
  24. INSERT INTO @RtnValue (DATA)  
  25. SELECT DATA = ltrim(rtrim(@applicationid))  
  26.  
  27. RETURN  
  28. END  
  29.  
  30. y usando la funcion que acabamos de crear:
  31.  
  32. DECLARE @valor INT
  33. SELECT @valor=id FROM [SplitApplication]('1;2;;;') WHERE DATA LIKE '%2%'
  34.  
  35. SELECT * FROM [SplitApplication]('20;-60;0;0;0') WHERE id=@valor
  36.  
  37. lo cual nos regresa el famoso -60
  38.  
  39. si se cambia la posicion del numero 2 en la primer cadena entonces cambia el valor del segundo SELECT :) ahora es que nuestro amig@ lo ponga a prueba para sus datos :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 26/07/2012, 15:32
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Lo voy checar....gracias a todos por sus respuestas...
  #10 (permalink)  
Antiguo 26/07/2012, 16:09
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Buscar dato en cadena Separada por Comas

Arañon !!!

Muy bien Libras, gran esfuerzo

Saludos
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 26/07/2012, 16:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

muchas gracias mi estimado iislas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 26/07/2012, 16:33
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Si funciona, abusando de tu conocimiento..el unico detalle es asociarlo a la tabla de datos..como podria ser..?..gracias de antemano
  #13 (permalink)  
Antiguo 26/07/2012, 17:55
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

ok...estoy haciendo unos cambios..para que me pueda leer de la tabla..

declare @valor nvarchar
declare @consulta nvarchar
declare @consulta2 nvarchar
SET @consulta = (SELECT paytype FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')
SET @consulta2 = (SELECT payamt FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')

SELECT @valor=id FROM [SplitApplication](@consulta) WHERE DATA LIKE '%2%'
SELECT * FROM [SplitApplication](@consulta2) WHERE id=@valor

pero me marca este error


Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Msg 512, Level 16, State 1, Line 7
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


le voy a seguir buscando..pero es correcta la logica que estoy usando..?..gracias
  #14 (permalink)  
Antiguo 27/07/2012, 08:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

el error es porque la funcion nada mas acepta 1 valor y tu estas regresando mas de uno, tendrias que hacer tu consulta tipo

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. value1 VARCHAR(20),
  3. value2 VARCHAR(20)
  4. )
  5.  
  6. INSERT INTO #temp VALUES ('1;2;;;','20;-60;0;0;0')
  7. INSERT INTO #temp VALUES ('1;0;2;;','20;-60;10;0;0')
  8.  
  9. SELECT
  10. (SELECT DATA FROM [SplitApplication](value2) WHERE id=(SELECT id FROM [SplitApplication](value1) WHERE DATA LIKE '%2%')) AS dato FROM #temp

saludos!

(deberia de cobrar por estas consultas me cae :S )
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 27/07/2012, 10:00
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Buscar dato en cadena Separada por Comas

Si ejecutas esta 2 consultas, ¿cuantos registros te regresan?

SELECT paytype FROM sales2 where TYPE='2' and idate>='20120724' and idate<='20120724'
SELECT payamt FROM sales2 where TYPE='2' and idate>='20120724' and idate<='20120724'

NOTA: Checa el formato de la fecha que estoy colocando sin guiones...
__________________
MCTS Isaias Islas
  #16 (permalink)  
Antiguo 27/07/2012, 11:15
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

si yo corro esa consulta me debe de leer alrededor de 6000 registros pero me debe devolver alrededor de 200 campos solamente. y si lo filtro mas solamente debe de devolver alrededor de 20 registros por consulta, todo esto dependiendo de los filtros que le aplique a la consulta, eso si el campo debe de tener el famoso No2. en diferentes posiciones,,ya sea en la primera o en la segunda...posicion, como les explique en el otro ejemplo. saludos y Gracias a todos por sus respuestas
  #17 (permalink)  
Antiguo 27/07/2012, 11:19
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Información La función Choose

Hace un momento me acordé de que en la versión SQL Server 2012 hay una nueva función - Choose:
Código SQL:
Ver original
  1. SELECT Choose (3,19,28,37,46,55,64,73,82,91);
El resultado en este caso es 37 que es el tercer valor (el 3 es el indice y los valores son los siguientes).
Me imagino que todavia no utilizas SQL 2012, pero en el futuro probablemente si..
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #18 (permalink)  
Antiguo 27/07/2012, 11:21
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Libra...oyes pero lo que yo necesito es meter el resultado de las consultas , en el codigo que te puse anteriormente..es correcto como lo estoy poniendo..?


declare @valor nvarchar
declare @consulta nvarchar
declare @consulta2 nvarchar
SET @consulta = (SELECT paytype FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')
SET @consulta2 = (SELECT payamt FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')

SELECT @valor=id FROM [SplitApplication](@consulta) WHERE DATA LIKE '%2%'
SELECT * FROM [SplitApplication](@consulta2) WHERE id=@valor
  #19 (permalink)  
Antiguo 27/07/2012, 11:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

mientras regreses nada mas un registro si.... what do you mean with "meter el resultado a las columnas"?

Ademas ya tienes lo mas dificil, lo que sigues es cantar y tejer que creo lo puedes hacer no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 27/07/2012, 11:46
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

entonces no va a funcionar para muchos registros...?..lo que yo necesito es que me lea los registros de una consulta..no es solamente 1 solo registro...pero pues le voy a mover a ver que le encuentro..gracias por tu ayuda..
  #21 (permalink)  
Antiguo 27/07/2012, 11:56
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

para muchos registros tienes el select que te pase o asi no te sirve??? que diferencia hay entre el select que te pase y lo que quieres lograr?? mi no entender....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #22 (permalink)  
Antiguo 27/07/2012, 12:04
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

lo que tu me pasaste si funciona..pero lo que yo ocupo es ligarlo con 2 tablas...tal como lo plantee en el problema...es decir...que el campo donde esta el No2...busque en una tabla...y donde busca el no dependiendo de la poscion del no 2 , busque en otra , estamos hablando de alrededor de unos 200 registros los que debe de arrojar..por eso te preguntaba si la modificacion que hice es la correcta...hice una consulta en los parametros donde iban los numeros, pero me marcaba un error..he ahi la duda...gracias

declare @valor nvarchar
declare @consulta nvarchar
declare @consulta2 nvarchar
SET @consulta = (SELECT paytype FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')
SET @consulta2 = (SELECT payamt FROM sales2 where TYPE='2' and idate>='2012-07-24' and idate<='2012-07-24')

SELECT @valor=id FROM [SplitApplication](@consulta) WHERE DATA LIKE '%2%'
SELECT * FROM [SplitApplication](@consulta2) WHERE id=@valor
  #23 (permalink)  
Antiguo 27/07/2012, 12:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

y esto no te sirve:

Código SQL:
Ver original
  1. CREATE TABLE #temp1(
  2. id INT,
  3. value1 VARCHAR(20)
  4.  
  5. )
  6.  
  7.  
  8. CREATE TABLE #temp2(
  9. id INT,
  10. value2 VARCHAR(20)
  11. )
  12.  
  13.  
  14. INSERT INTO #temp1 VALUES (1,'1;2;;;')
  15. INSERT INTO #temp1 VALUES (2,'1;1;2;;')
  16. INSERT INTO #temp2 VALUES (1,'1;-60;2;;')
  17. INSERT INTO #temp2 VALUES (2,'1;10;30;;')
  18.  
  19. SELECT value1,value2 ,
  20. (SELECT DATA FROM [SplitApplication](value2) WHERE id=(SELECT id FROM [SplitApplication](value1) WHERE DATA LIKE '%2%')) AS dato FROM #temp1 AS t1
  21. INNER JOIN #temp2 AS t2 ON (t1.id=t2.id)
  22.  
  23.  
  24. value1      value2     Dato
  25. 1;2;;;  1;-60;2;;   -60
  26. 1;1;2;; 1;10;30;;   30

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #24 (permalink)  
Antiguo 27/07/2012, 12:41
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Voy a hacer la prueba carnal..pero la neta...me sigue la duda de como vincularlo con mis tablas....jeje....gracias
  #25 (permalink)  
Antiguo 27/07/2012, 13:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar dato en cadena Separada por Comas

pruebale y buscale ya tienes el camino echo es solo de que lo recorras :) mucha suerte
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #26 (permalink)  
Antiguo 27/07/2012, 13:13
 
Fecha de Ingreso: junio-2011
Mensajes: 329
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Buscar dato en cadena Separada por Comas

Simon..gracias

Etiquetas: comas, dato, select, server, sql, campos, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:25.