¿Cómo elimino los primeros caracteres de una columna específica en una tabla?


162

En SQL, ¿cómo puedo eliminar los primeros 4 caracteres de valores de una columna específica en una tabla? El nombre de la columna es Student Codey un valor de ejemplo es ABCD123Stu1231. Quiero eliminar los primeros 4 caracteres de mi tabla para todos los registros

Por favor guíame

Respuestas:


259
SELECT RIGHT(MyColumn, LEN(MyColumn) - 4) AS MyTrimmedColumn

Editar: Para explicar, DERECHA toma 2 argumentos: la cadena (o columna) para operar, y el número de caracteres para devolver (comenzando en el lado "derecho" de la cadena). LEN devuelve la longitud de los datos de la columna, y restamos cuatro para que nuestra función DERECHA deje los 4 caracteres más a la izquierda "detrás".

Espero que esto tenga sentido.

Edite de nuevo: acabo de leer la respuesta de Andrew, y es muy posible que haya interpretado correctamente, y podría estar equivocado. Si este es el caso (y desea ACTUALIZAR la tabla en lugar de simplemente devolver resultados alterados), puede hacer esto:

UPDATE MyTable
SET MyColumn = RIGHT(MyColumn, LEN(MyColumn) - 4)

Está en el camino correcto, pero su solución mantendrá los 4 caracteres al comienzo de la cadena, en lugar de descartar dichos 4 caracteres.


9
esto fallará para valores con <4 caracteres. Debe agregar un bloque de mayúsculas y minúsculas para devolver el valor de la columna para <4.
Scott Ivey

2
Probablemente, la mejor manera de manejarlo sería simplemente: ACTUALIZAR MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 El SUBSTRING no generaría errores, pero también "actualizaría" filas innecesariamente con menos de cuatro caracteres. Dicho esto, el OP indicó que querían recortar los primeros 4 caracteres de una columna específica; supongo que a menos que se proporcione con mayor detalle que TODAS las filas deben recortarse.
Aaron Alton

1
@ spencer7593 - jajaja ... cierto. Siempre puede agregar una cláusula WHERE para estar seguro: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton

¿Es seguro llamar a esto en una columna NULL? ¿Pasaría en este caso?
Ian R. O'Brien

Terminé usando en COL_LENGTH('MyTable', 'MyColumn')lugar de LEN(MyColumn)porque en mi caso quería excluir los primeros n caracteres sin importar el tamaño del contenido real dentro de la columna, ¡pero esto funcionó bien aparte de eso!
sfarbota

86
Stuff(someColumn, 1, 4, '')

Esto dice, comenzando con la 1posición del primer personaje, reemplace los 4caracteres con nada''


77
Antigua pregunta, lo sé, pero prefiero esta solución, ya que no usa más de 1 función o tiene algún número grande aleatorio.
Edwin Stoteler

44
Aún más: si someColumnes algo complejo como una subselección de un CTE o algo, esto no requiere evaluarlo dos veces.
Jeff

1
Para su información, esta solución también funciona muy bien para recortar valores numéricos.
Steven Ball

1
para aumentar lo que dijiste, aquí hay un resultado completo. primero, haga una selección, asegúrese de obtener las filas que desea, luego haga lo correcto en esta actualización. NOTA / tenga cuidado: después de que se ejecute correctamente, no lo ejecute nuevamente, ya que corta indiscriminadamente los primeros 4 caracteres: conjunto de tablas de actualización textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) donde activitytype = 'A' y fecha de aprobación> '2017-06-30' y textField no como '% The County1%' y textField no como '% The County2%' y abstract no como '% The County3%') y activityid en (12345, ... rango de identificación ... 56789)
dcparham

33

¿Por qué usar LEN para tener 2 funciones de cadena? Todo lo que necesitas es el personaje 5 en ...

...SUBSTRING (Code1, 5, 8000)...

1
¿Es esto una prueba de futuro? ¿Es posible que las futuras versiones de MSSQL puedan usar un tamaño máximo de varchar mayor de 8,000?
Webs de desarrolladores

3
varchar (max) ya es más grande que 8000 caracteres. Sin embargo, si pones len (columna) funcionará para siempre
Gaspa79

2
O simplemente use 2000000000. ¿Por qué agregar una función LEN? No agrega valor y también ignora los espacios finales (si los desea)
gbn

1
Gracias, esto funcionó bien para mí como algo excepcional. La respuesta aceptada fue, por alguna razón, cortar caracteres adicionales en algunos casos, pero esto funciona a la perfección.
user2366842

2
@ user2366842 La razón probable por la que usar la respuesta aceptada fue cortar caracteres adicionales es que probablemente tenía espacios finales en el texto. Puede compensar eso si lo desea utilizando RTRIM y LTRIM.
Spazmoose

13

Prueba esto:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);

7

Aquí hay una simple maqueta de lo que estás tratando de hacer :)

CREATE TABLE Codes
(
code1 varchar(10),
code2 varchar(10)
)

INSERT INTO Codes (CODE1, CODE2) vALUES ('ABCD1234','')


UPDATE Codes
SET code2 = SUBSTRING(Code1, 5, LEN(CODE1) -4)

Por lo tanto, use la última instrucción contra el campo que desea recortar :)

La función SUBSTRING recorta Code1, comenzando en el QUINTO carácter y continuando durante la longitud de CODE1 menos 4 (el número de caracteres omitidos al inicio).


5

Lo completo

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'

3

También puede hacer esto en SQL.

substring(StudentCode,4,len(StudentCode))

sintaxis

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)

3

Prueba esto. 100% trabajando

UPDATE Table_Name
SET RIGHT(column_name, LEN(column_name) - 1)

  


3

La respuesta principal no es adecuada cuando los valores pueden tener una longitud inferior a 4.

En T-SQL

Obtendrá "Parámetro de longitud no válido pasado a la función correcta" porque no acepta negativos. Use una declaración CASE:

SELECT case when len(foo) >= 4 then RIGHT(foo, LEN(foo) - 4) else '' end AS myfoo from mytable;

En Postgres

Los valores inferiores a 4 dan el comportamiento sorprendente a continuación en lugar de un error, porque pasar valores negativos a DERECHA recorta los primeros caracteres en lugar de la cadena completa. Tiene más sentido usar RIGHT(MyColumn, -5)en su lugar.

Un ejemplo que compara lo que obtienes cuando usas la "longitud - 5" de la respuesta superior en lugar de "-5":

create temp table foo (foo) as values ('123456789'),('12345678'),('1234567'),('123456'),('12345'),('1234'),('123'),('12'),('1'), ('');

select foo, right(foo, length(foo) - 5), right(foo, -5) from foo;

foo       len(foo) - 5  just -5   
--------- ------------  -------     
123456789 6789          6789 
12345678  678           678  
1234567   67            67   
123456    6             6    
12345                       
1234      234               
123       3                 
12                          
1                           

1
¿Qué base de datos usas? La pregunta tiene la etiqueta tsql, pero T-SQL no permite parámetros negativos. Recibo el mensaje de error "Parámetro de longitud no válido pasado a la función correcta".
palota

No me di cuenta de las etiquetas. Dividir la respuesta en secciones T-SQL y Postgres. Gracias.
Noumenon


2

Sería bueno compartir, para el uso de DB2: INSERT(someColumn, 1, 4, '')

Stuff no está soportado en DB2


1

Si tiene que eliminar los primeros caracteres precedidos por un carácter especial como #, este es uno bueno:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.