sql server - right - Cómo extraigo parte de una cadena en t-sql
sql server substring right (4)
Si tengo la siguiente variable nvarchar, BTA200, ¿cómo puedo extraer solo la BTA de ella?
Además, si tengo longitudes variables como BTA50, BTA030, ¿cómo puedo extraer solo la parte numérica?
LEFT (''BTA200'', 3) funcionará para los ejemplos que haya dado, como en:
SELECT LEFT(MyField, 3)
FROM MyTable
Para extraer la parte numérica, puede usar este código
SELECT RIGHT(MyField, LEN(MyField) - 3)
FROM MyTable
WHERE MyField LIKE ''BTA%''
--Only have this test if your data does not always start with BTA.
Yo recomendaría una combinación de PatIndex y Left. Con una construcción cuidadosa, puede escribir una consulta que siempre funcione, sin importar cuáles sean sus datos.
Ex:
Declare @Temp Table(Data VarChar(20))
Insert Into @Temp Values(''BTA200'')
Insert Into @Temp Values(''BTA50'')
Insert Into @Temp Values(''BTA030'')
Insert Into @Temp Values(''BTA'')
Insert Into @Temp Values(''123'')
Insert Into @Temp Values(''X999'')
Select Data, Left(Data, PatIndex(''%[0-9]%'', Data + ''1'') - 1)
From @Temp
PatIndex buscará el primer carácter que esté en el rango de 0-9, y devolverá su posición de carácter, que puede usar con la función IZQUIERDA para extraer los datos correctos. Tenga en cuenta que PatIndex está usando datos + ''1''. Esto nos protege de los datos donde no se encuentran números. Si no hay números, PatIndex devolvería 0. En este caso, la función IZQUIERDA arrojaría un error porque estamos usando Left (Data, PatIndex - 1). Cuando PatIndex devuelva 0, terminaríamos con Left (Data, -1) que devuelve un error.
Todavía hay formas en que esto puede fallar. Para una explicación completa, te animo a leer:
Extrayendo números con SQL Server
Ese artículo muestra cómo sacar números de una cadena. En su caso, quiere obtener caracteres alfabéticos en su lugar. Sin embargo, el proceso es lo suficientemente similar como para que puedas aprender algo útil de él.
substring (field, 1,3) funcionará en sus ejemplos.
select substring(field, 1,3) from table
Además, si la parte alfabética es de longitud variable, puede hacer esto para extraer la parte alfabética:
select substring(field, 1, PATINDEX(''%[1234567890]%'', field) -1)
from table
where PATINDEX(''%[1234567890]%'', field) > 0
declare @data as varchar(50)
set @data=''ciao335''
--get text
Select Left(@Data, PatIndex(''%[0-9]%'', @Data + ''1'') - 1) ---->>ciao
--get numeric
Select right(@Data, len(@data) - (PatIndex(''%[0-9]%'', @Data )-1) ) ---->>335