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

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.


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''


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)...

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);

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).


5

La chose complète

DECLARE @v varchar(10)

SET @v='#temp'

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

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>)

3

Essaye ça. 100% de travail

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

  


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                           

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

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

Stuff n'est pas pris en charge dans DB2


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), ' ') 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.