Wie entferne ich die ersten Zeichen einer bestimmten Spalte in einer Tabelle?

160

Wie kann ich in SQL die ersten 4 Zeichen von Werten einer bestimmten Spalte in einer Tabelle entfernen? Der Spaltenname ist Student Codeund ein Beispielwert ist ABCD123Stu1231. Ich möchte die ersten 4 Zeichen für alle Datensätze aus meiner Tabelle entfernen

Bitte führen Sie mich

Shyju
quelle

Antworten:

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

Bearbeiten: Zur Erklärung benötigt RIGHT zwei Argumente - die Zeichenfolge (oder Spalte), mit der gearbeitet werden soll, und die Anzahl der zurückzugebenden Zeichen (beginnend an der "rechten" Seite der Zeichenfolge). LEN gibt die Länge der Spaltendaten zurück und wir subtrahieren vier, so dass unsere RIGHT-Funktion die 4 Zeichen ganz links "zurücklässt".

Hoffe das macht Sinn.

Nochmals bearbeiten - Ich habe gerade Andrews Antwort gelesen, und er hat sich möglicherweise richtig verhalten, und ich könnte mich irren. Wenn dies der Fall ist (und Sie die Tabelle AKTUALISIEREN möchten, anstatt nur behandelte Ergebnisse zurückzugeben), können Sie Folgendes tun:

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

Er ist auf dem richtigen Weg, aber seine Lösung behält die 4 Zeichen am Anfang der Zeichenfolge bei, anstatt die 4 Zeichen zu verwerfen.

Aaron Alton
quelle
9
Dies schlägt bei Werten mit <4 Zeichen fehl. Sie sollten einen Fallblock hinzufügen, um den Wert der Spalte für <4 zurückzugeben.
Scott Ivey
2
Der wahrscheinlich beste Weg, damit umzugehen, wäre einfach: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 Der SUBSTRING würde keinen Fehler verursachen, aber er würde auch unnötigerweise Zeilen "aktualisieren" mit weniger als vier Zeichen. Das OP gab jedoch an, dass die ersten 4 Zeichen einer bestimmten Spalte gekürzt werden sollen. Ich würde davon ausgehen, dass ALLE Zeilen gekürzt werden müssen, sofern nicht detaillierter angegeben wird.
Aaron Alton
1
@ spencer7593 - hahaha ... wahr. Sie können jederzeit eine WHERE-Klausel hinzufügen, um sicher zu gehen: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton
Ist es sicher, dies in einer NULL-Spalte aufzurufen? Würde in diesem Fall passieren?
Ian R. O'Brien
Ich habe letztendlich COL_LENGTH('MyTable', 'MyColumn')statt verwendet, LEN(MyColumn)weil ich in meinem Fall die ersten n Zeichen ausschließen wollte, unabhängig von der Größe des tatsächlichen Inhalts in der Spalte, aber das hat ansonsten gut funktioniert!
Sfarbota
86
Stuff(someColumn, 1, 4, '')

Dies besagt, beginnend mit der ersten 1Zeichenposition, ersetzen Sie 4Zeichen durch nichts''

AaronLS
quelle
7
Alte Frage, die ich kenne, aber ich bevorzuge diese Lösung, da sie nicht mehr als 1 Funktion verwendet oder eine zufällige große Zahl enthält.
Edwin Stoteler
4
Noch mehr: Wenn someColumnes sich um etwas Komplexes wie eine Unterauswahl aus einem CTE oder etwas anderem handelt, muss es nicht zweimal ausgewertet werden.
Jeff
1
Zu Ihrer Information, diese Lösung eignet sich auch sehr gut zum Trimmen numerischer Werte.
Steven Ball
1
Um das zu ergänzen, was Sie gesagt haben, finden Sie hier ein vollständiges Ergebnis. Treffen Sie zuerst eine Auswahl, stellen Sie sicher, dass Sie die gewünschten Zeilen erhalten, und korrigieren Sie diese dann in diesem Update. HINWEIS / Vorsicht - nach erfolgreicher Ausführung nicht erneut ausführen, da die ersten 4 Zeichen wahllos abgeschnitten werden: Aktualisierungstabelle set textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) Dabei ist activitytype = 'A' und genehmigtes Datum> '2017-06-30' und textField nicht wie '% The County1%' und textField nicht wie '% The County2%' und abstract nicht wie '% The County3%') und activityid in (12345, ... Bereich von IDs ... 56789)
dcparham
33

Warum LEN verwenden, damit Sie 2 Zeichenfolgenfunktionen haben? Alles was du brauchst ist Charakter 5 auf ...

...SUBSTRING (Code1, 5, 8000)...
gbn
quelle
1
Ist das zukunftssicher? Ist es möglich, dass zukünftige Versionen von MSSQL eine maximale Varchar-Größe von mehr als 8.000 verwenden?
Entwickler Webs
3
varchar (max) ist bereits größer als 8000 Zeichen. Wenn Sie len (Spalte) setzen, wird es für immer funktionieren
Gaspa79
2
Oder verwenden Sie einfach 2000000000. Warum eine LEN-Funktion hinzufügen? Fügt keinen Wert hinzu und ignoriert auch nachgestellte Leerzeichen (wenn Sie sie möchten)
gbn
1
Danke, das hat für mich einmalig gut funktioniert. Die akzeptierte Antwort war aus irgendeinem Grund, in einigen Fällen zusätzliche Zeichen zu hacken, aber dies funktioniert einwandfrei.
user2366842
2
@ user2366842 Der wahrscheinliche Grund, warum die Verwendung der akzeptierten Antwort zusätzliche Zeichen abgeschnitten hat, ist, dass Sie wahrscheinlich nachgestellte Leerzeichen in Ihrem Text hatten. Sie können dies kompensieren, wenn Sie möchten, indem Sie RTRIM & LTRIM verwenden.
Spazmoose
13

Versuche dies:

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

Hier ist ein einfaches Modell dessen, was du versuchst :)

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)

Verwenden Sie also die letzte Anweisung für das Feld, das Sie trimmen möchten :)

Die SUBSTRING-Funktion schneidet Code1 ab dem fünften Zeichen ab und setzt sich für die Länge von CODE1 abzüglich 4 fort (die Anzahl der beim Start übersprungenen Zeichen).

rauben
quelle
5

Die komplette Sache

DECLARE @v varchar(10)

SET @v='#temp'

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

Sie können dies auch in SQL tun.

substring(StudentCode,4,len(StudentCode))

Syntax

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

Versuche dies. 100% arbeiten

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

  

Ilyes
quelle
3

Die Top-Antwort ist nicht geeignet, wenn Werte eine Länge von weniger als 4 haben können.

In T-SQL

Sie erhalten "Ungültiger Längenparameter an die richtige Funktion übergeben", da keine Negative akzeptiert werden. Verwenden Sie eine CASE-Anweisung:

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

In Postgres

Werte unter 4 ergeben anstelle eines Fehlers das unten stehende überraschende Verhalten, da beim Übergeben negativer Werte an RIGHT die ersten Zeichen anstelle der gesamten Zeichenfolge abgeschnitten werden. Es ist sinnvoller, RIGHT(MyColumn, -5)stattdessen zu verwenden .

Ein Beispiel für den Vergleich dessen, was Sie erhalten, wenn Sie die "Länge - 5" der obersten Antwort anstelle von "-5" verwenden:

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                           
Noumenon
quelle
1
Welche Datenbank verwenden Sie? Die Frage hat ein tsql-Tag, aber T-SQL erlaubt keine negativen Parameter. Ich erhalte die Fehlermeldung "Ungültiger Längenparameter an die richtige Funktion übergeben."
Palota
Ich habe die Tags nicht bemerkt. Teilen Sie die Antwort in T-SQL- und Postgres-Abschnitte auf. Danke dir.
Noumenon
2

Es gibt die eingebaute Trimmfunktion, die perfekt für diesen Zweck ist.

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

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

linuxatico
quelle
1
Während dies für PostgreSQL-Benutzer nützlich sein kann, hat das OP tsql / sql-server in den Frage-Tags angegeben.
CodeMonkey1313
2

Es wäre gut zu teilen, Für DB2 verwenden: INSERT(someColumn, 1, 4, '')

Stuff wird in DB2 nicht unterstützt

Superb Saif
quelle
1

Wenn Sie die ersten Zeichen entfernen müssen, denen ein Sonderzeichen wie vorangestellt ist #, ist dies eine gute:

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