Comment supprimer les premiers caractères d'une colonne spécifique dans un tableau?

162

En SQL, comment puis-je supprimer les 4 premiers caractères des valeurs d'une colonne spécifique dans une table? Le nom de la colonne est Student Codeet un exemple de valeur est ABCD123Stu1231. Je souhaite supprimer les 4 premiers caractères de ma table pour tous les enregistrements

Guidez-moi s'il-vous-plaît

Shyju
la source

Réponses:

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

Edit: Pour expliquer, RIGHT prend 2 arguments - la chaîne (ou colonne) sur laquelle opérer, et le nombre de caractères à renvoyer (en commençant par le côté "droit" de la chaîne). LEN renvoie la longueur des données de la colonne et nous soustrayons quatre pour que notre fonction DROITE laisse les 4 caractères les plus à gauche "derrière".

J'espère que cela a du sens.

Modifier à nouveau - Je viens de lire la réponse d'Andrew, et il se peut très bien qu'il ait interprété correctement, et je me trompe peut-être. Si tel est le cas (et que vous souhaitez METTRE À JOUR la table plutôt que de simplement renvoyer des résultats trafiqués), vous pouvez le faire:

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

Il est sur la bonne voie, mais sa solution conservera les 4 caractères au début de la chaîne, plutôt que de supprimer les 4 caractères.

Aaron Alton
la source
9
cela échouera pour les valeurs avec <4 caractères. Vous devez ajouter un bloc de cas pour renvoyer la valeur de la colonne pour <4.
Scott Ivey
2
Probablement la meilleure façon de le gérer serait simplement: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 Le SUBSTRING ne ferait pas d'erreur, mais il "mettrait à jour" inutilement les lignes avec moins de quatre caractères. Cela dit, l'OP a indiqué qu'il voulait couper les 4 premiers caractères d'une colonne spécifique - je suppose que, à moins d'être fourni avec plus de détails, TOUTES les lignes doivent être coupées.
Aaron Alton
1
@ spencer7593 - hahaha ... vrai. Vous pouvez toujours ajouter une clause WHERE pour être sûr: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton
Est-il sûr d'appeler cela sur une colonne NULL? Se passerait-il dans ce cas?
Ian R. O'Brien
J'ai fini par utiliser COL_LENGTH('MyTable', 'MyColumn')au lieu de LEN(MyColumn)parce que dans mon cas, je voulais exclure les n premiers caractères, quelle que soit la taille du contenu réel dans la colonne, mais cela fonctionnait bien à part ça!
sfarbota
86
Stuff(someColumn, 1, 4, '')

Cela dit, en commençant par la première 1position de caractère, remplacez les 4caractères par rien''

AaronLS
la source
7
Ancienne question que je connais, mais je préfère cette solution, car elle n'utilise pas plus d'une fonction ou contient un grand nombre aléatoire.
Edwin Stoteler
4
Encore plus: s'il someColumns'agit de quelque chose de complexe comme une sous-sélection d'un CTE ou quelque chose, cela ne nécessite pas de l'évaluer deux fois.
Jeff
1
Pour info, cette solution fonctionne également très bien pour rogner les valeurs numériques.
Steven Ball
1
pour compléter ce que vous avez dit, voici un résultat complet. Tout d'abord, faites une sélection, assurez-vous d'obtenir les lignes que vous voulez, puis faites-le correctement dans cette mise à jour. REMARQUE / méfiez-vous - une fois qu'il s'exécute avec succès, ne l'exécutez pas à nouveau, car il coupe sans discernement les 4 premiers caractères: update table set textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) où activitytype = 'A' et approuvédate> '2017-06-30' et textField pas comme '% The County1%' et textField pas comme '% The County2%' et abstract pas comme '% The County3%') et activityid dans (12345, ... range of id's ... 56789)
dcparham
33

Pourquoi utiliser LEN pour avoir 2 fonctions de chaîne? Tout ce dont vous avez besoin est le caractère 5 sur ...

...SUBSTRING (Code1, 5, 8000)...
gbn
la source
1
Est-ce la preuve du futur? Est-il possible que les futures versions de MSSQL utilisent une taille de varchar maximale supérieure à 8 000?
Developer Webs
3
varchar (max) est déjà plus grand que 8000 caractères. Si vous mettez len (colonne), cela fonctionnera pour toujours
Gaspa79
2
Ou utilisez simplement 2000000000. Pourquoi ajouter une fonction LEN. N'ajoute aucune valeur et ignore également les espaces de fin (si vous les voulez)
gbn
1
Merci, cela a bien fonctionné pour moi de manière ponctuelle. La réponse acceptée était pour une raison quelconque de couper des caractères supplémentaires dans certains cas, mais cela fonctionne parfaitement.
user2366842
2
@ user2366842 La raison probable pour laquelle l'utilisation de la réponse acceptée coupait des caractères supplémentaires est que vous aviez probablement des espaces de fin dans votre texte. Vous pouvez compenser cela si vous le souhaitez en utilisant RTRIM et LTRIM.
Spazmoose
13

Essaye ça:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);
Andrew Hare
la source
7

Voici une simple maquette de ce que vous essayez de faire :)

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)

Alors, utilisez la dernière instruction contre le champ que vous souhaitez découper :)

La fonction SUBSTRING réduit Code1, en commençant au CINQUIÈME caractère, et en continuant pour la longueur de CODE1 moins 4 (le nombre de caractères sautés au début).

Rob
la source
5

La chose complète

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'
Higarian
la source
3

Vous pouvez également le faire en SQL.

substring(StudentCode,4,len(StudentCode))

syntaxe

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)
Durgesh Pandey
la source
3

Essaye ça. 100% de travail

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

  

Ilyes
la source
3

La réponse du haut ne convient pas lorsque les valeurs peuvent avoir une longueur inférieure à 4.

Dans T-SQL

Vous obtiendrez un "paramètre de longueur non valide passé à la bonne fonction" car il n'accepte pas les négatifs. Utilisez une instruction CASE:

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

Dans Postgres

Les valeurs inférieures à 4 donnent le comportement surprenant ci-dessous au lieu d'une erreur, car le fait de transmettre des valeurs négatives à RIGHT coupe les premiers caractères au lieu de la chaîne entière. Il est plus logique d'utiliser à la RIGHT(MyColumn, -5)place.

Un exemple comparant ce que vous obtenez lorsque vous utilisez la première réponse "longueur - 5" au lieu 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                           
Noumène
la source
1
Quelle base de données utilisez-vous? La question a une balise tsql, mais T-SQL n'autorise pas les paramètres négatifs. J'obtiens le message d'erreur "Paramètre de longueur non valide passé à la bonne fonction."
palota
Je n'ai pas remarqué les balises. Divisez la réponse en sections T-SQL et Postgres. Je vous remercie.
Noumenon le
2

Il y a la fonction de garniture intégrée qui est parfaite pour le but.

SELECT trim(both 'ag' from 'asdfg');
btrim 
-------
 sdf
(1 riga)

http://www.postgresql.org/docs/8.1/static/functions-string.html

linuxatico
la source
1
Bien que cela puisse être utile pour les utilisateurs de PostgreSQL, l'OP a spécifié tsql / sql-server dans les balises de question.
CodeMonkey1313
2

Ce serait bien de partager, pour DB2: INSERT(someColumn, 1, 4, '')

Stuff n'est pas pris en charge dans DB2

Superbe Saif
la source
1

Si vous devez supprimer les premiers caractères qui sont précédés d'un caractère spécial comme #, c'est un bon:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Prachita
la source