Parte numerica de un campo

07/12/2007 - 20:17 por Antonio Ortiz | Informe spam
Existe alguna manera de obtener la parte numerica de un campo?

Por ejemplo:

A101
AB2
XYZ12345

quiero obtener:
101
2
12345

Se agradece cualquier ayuda, estoy atorado con esto.

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
07/12/2007 - 20:33 | Informe spam
Antonio Ortiz,

Trata:

SELECT
CASE WHEN c1 LIKE '%[0-9]%' THEN RIGHT(c1, PATINDEX('%[^0-9]%',
REVERSE(c1)) - 1) ELSE c1 END AS c1
FROM
(
SELECT 'A101' AS c1
UNION ALL
SELECT 'AB2'
UNION ALL
SELECT 'XYZ12345'
UNION ALL
SELECT 'Microsoft SQL Server 2008'
) AS t
GO

Si los digitos no estan siempre a la derecha, entonces tendras que crear una
funcion que devuelva solo los caracteres numericos.


AMB

"Antonio Ortiz" wrote:

Existe alguna manera de obtener la parte numerica de un campo?

Por ejemplo:

A101
AB2
XYZ12345

quiero obtener:
101
2
12345

Se agradece cualquier ayuda, estoy atorado con esto.

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



Respuesta Responder a este mensaje
#2 Antonio Ortiz
07/12/2007 - 20:43 | Informe spam
Gracias Alejandro, buscando un poquito hice esto:

CASE WHEN PATINDEX('%[0123456789]%',
dbo.TbaProducto.Codigo) = 1 THEN
SubString(TbaProducto.Codigo, 1, PATINDEX('%[^0123456789]%',
dbo.TbaProducto.Codigo) - 1)
ELSE SubString(TbaProducto.Codigo,
PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo), LEN(TbaProducto.Codigo))
END AS CodigoNo

y Para ordenerlo, simplemente le hice un CAST asi:

ORDER BY CAST(CASE WHEN PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo) =
1 THEN SubString(TbaProducto.Codigo, 1,
PATINDEX('%[^0123456789]%', dbo.TbaProducto.Codigo) -
1) ELSE SubString(TbaProducto.Codigo, PATINDEX('%[0123456789]%',
dbo.TbaProducto.Codigo), LEN(TbaProducto.Codigo)) END
AS int)


gracias de nuevo,


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com




"Alejandro Mesa" escribió en el
mensaje news:
Antonio Ortiz,

Trata:

SELECT
CASE WHEN c1 LIKE '%[0-9]%' THEN RIGHT(c1, PATINDEX('%[^0-9]%',
REVERSE(c1)) - 1) ELSE c1 END AS c1
FROM
(
SELECT 'A101' AS c1
UNION ALL
SELECT 'AB2'
UNION ALL
SELECT 'XYZ12345'
UNION ALL
SELECT 'Microsoft SQL Server 2008'
) AS t
GO

Si los digitos no estan siempre a la derecha, entonces tendras que crear
una
funcion que devuelva solo los caracteres numericos.


AMB

"Antonio Ortiz" wrote:

Existe alguna manera de obtener la parte numerica de un campo?

Por ejemplo:

A101
AB2
XYZ12345

quiero obtener:
101
2
12345

Se agradece cualquier ayuda, estoy atorado con esto.

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



Respuesta Responder a este mensaje
#3 Antonio Ortiz
07/12/2007 - 21:15 | Informe spam
Efectivamente se me paso indicar que los digitos estan en cualquier
posicion.


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



"Antonio Ortiz" escribió en el mensaje
news:
Gracias Alejandro, buscando un poquito hice esto:

CASE WHEN PATINDEX('%[0123456789]%',
dbo.TbaProducto.Codigo) = 1 THEN
SubString(TbaProducto.Codigo, 1, PATINDEX('%[^0123456789]%',
dbo.TbaProducto.Codigo) - 1)
ELSE SubString(TbaProducto.Codigo,
PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo),
LEN(TbaProducto.Codigo)) END AS CodigoNo

y Para ordenerlo, simplemente le hice un CAST asi:

ORDER BY CAST(CASE WHEN PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo)
= 1 THEN SubString(TbaProducto.Codigo, 1,
PATINDEX('%[^0123456789]%', dbo.TbaProducto.Codigo) -
1) ELSE SubString(TbaProducto.Codigo, PATINDEX('%[0123456789]%',
dbo.TbaProducto.Codigo), LEN(TbaProducto.Codigo)) END
AS int)


gracias de nuevo,


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com




"Alejandro Mesa" escribió en el
mensaje news:
Antonio Ortiz,

Trata:

SELECT
CASE WHEN c1 LIKE '%[0-9]%' THEN RIGHT(c1, PATINDEX('%[^0-9]%',
REVERSE(c1)) - 1) ELSE c1 END AS c1
FROM
(
SELECT 'A101' AS c1
UNION ALL
SELECT 'AB2'
UNION ALL
SELECT 'XYZ12345'
UNION ALL
SELECT 'Microsoft SQL Server 2008'
) AS t
GO

Si los digitos no estan siempre a la derecha, entonces tendras que crear
una
funcion que devuelva solo los caracteres numericos.


AMB

"Antonio Ortiz" wrote:

Existe alguna manera de obtener la parte numerica de un campo?

Por ejemplo:

A101
AB2
XYZ12345

quiero obtener:
101
2
12345

Se agradece cualquier ayuda, estoy atorado con esto.

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com









Respuesta Responder a este mensaje
#4 Alejandro Mesa
07/12/2007 - 21:56 | Informe spam
Antonio,

Tendras que crear una funcion que retorne la concatenacion de todos los
digitos dentro den una cadena. Ve si esto te es de ayuda.

CREATE FUNCTION dbo.ufn_Numbers (
@i INT)
RETURNS TABLE
AS
RETURN (
WITH
L0 AS (SELECT 1 AS c1 UNION ALL SELECT 1),
L1 AS (SELECT 1 AS c1 FROM L0 AS a CROSS JOIN L0 AS b),
L2 AS (SELECT 1 AS c1 FROM L1 AS a CROSS JOIN L1 AS b),
L3 AS (SELECT 1 AS c1 FROM L2 AS a CROSS JOIN L2 AS b),
Numbers AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS Number FROM L3)
SELECT Number FROM Numbers WHERE Number <= @i
)
GO

DECLARE @t TABLE (c1 VARCHAR(256))

INSERT INTO @t(c1)
SELECT 'A101' AS c1
UNION ALL
SELECT 'AB2'
UNION ALL
SELECT 'XYZ12345'
UNION ALL
SELECT '2005 Microsoft SQL Server 2008'

SELECT
c1,
(
SELECT
'' + SUBSTRING(t2.c1, n.Number, 1)
FROM
@t AS t2
CROSS APPLY
dbo.ufn_Numbers(LEN(t2.c1)) AS n
WHERE
t2.c1 = t1.c1
AND ISNUMERIC(SUBSTRING(t2.c1, n.Number, 1)) = 1
ORDER BY
n.Number
FOR XML PATH('')
) AS digits
FROM
@t AS t1
GO

DROP FUNCTION dbo.ufn_Numbers
GO

AMB


"Antonio Ortiz" wrote:

Efectivamente se me paso indicar que los digitos estan en cualquier
posicion.


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



"Antonio Ortiz" escribió en el mensaje
news:
> Gracias Alejandro, buscando un poquito hice esto:
>
> CASE WHEN PATINDEX('%[0123456789]%',
> dbo.TbaProducto.Codigo) = 1 THEN
> SubString(TbaProducto.Codigo, 1, PATINDEX('%[^0123456789]%',
> dbo.TbaProducto.Codigo) - 1)
> ELSE SubString(TbaProducto.Codigo,
> PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo),
> LEN(TbaProducto.Codigo)) END AS CodigoNo
>
> y Para ordenerlo, simplemente le hice un CAST asi:
>
> ORDER BY CAST(CASE WHEN PATINDEX('%[0123456789]%', dbo.TbaProducto.Codigo)
> = 1 THEN SubString(TbaProducto.Codigo, 1,
> PATINDEX('%[^0123456789]%', dbo.TbaProducto.Codigo) -
> 1) ELSE SubString(TbaProducto.Codigo, PATINDEX('%[0123456789]%',
> dbo.TbaProducto.Codigo), LEN(TbaProducto.Codigo)) END
> AS int)
>
>
> gracias de nuevo,
>
>
> Antonio Ortiz
> asesor en sistemas
> www.aortiz.net
> www.progvisual.com
>
>
>
>
> "Alejandro Mesa" escribió en el
> mensaje news:
>> Antonio Ortiz,
>>
>> Trata:
>>
>> SELECT
>> CASE WHEN c1 LIKE '%[0-9]%' THEN RIGHT(c1, PATINDEX('%[^0-9]%',
>> REVERSE(c1)) - 1) ELSE c1 END AS c1
>> FROM
>> (
>> SELECT 'A101' AS c1
>> UNION ALL
>> SELECT 'AB2'
>> UNION ALL
>> SELECT 'XYZ12345'
>> UNION ALL
>> SELECT 'Microsoft SQL Server 2008'
>> ) AS t
>> GO
>>
>> Si los digitos no estan siempre a la derecha, entonces tendras que crear
>> una
>> funcion que devuelva solo los caracteres numericos.
>>
>>
>> AMB
>>
>> "Antonio Ortiz" wrote:
>>
>>> Existe alguna manera de obtener la parte numerica de un campo?
>>>
>>> Por ejemplo:
>>>
>>> A101
>>> AB2
>>> XYZ12345
>>>
>>> quiero obtener:
>>> 101
>>> 2
>>> 12345
>>>
>>> Se agradece cualquier ayuda, estoy atorado con esto.
>>>
>>> Antonio Ortiz
>>> asesor en sistemas
>>> www.aortiz.net
>>> www.progvisual.com
>>>
>>>
>>>
>
>



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