Come rimuovo i primi caratteri di una colonna specifica in una tabella?


162

In SQL, come posso rimuovere i primi 4 caratteri di valori di una colonna specifica in una tabella? Il nome della colonna è Student Codee un valore di esempio è ABCD123Stu1231. Voglio rimuovere i primi 4 caratteri dalla mia tabella per tutti i record

Per favore, guidami

Risposte:


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

Modifica: per spiegare, DESTRA accetta 2 argomenti: la stringa (o colonna) su cui operare e il numero di caratteri da restituire (a partire dal lato "destro" della stringa). LEN restituisce la lunghezza dei dati della colonna e ne sottraggiamo quattro in modo che la nostra funzione DESTRA lasci "indietro" i 4 caratteri più a sinistra.

Spero che abbia senso.

Modifica di nuovo - Ho appena letto la risposta di Andrew, e potrebbe benissimo aver interpretato correttamente, e potrei sbagliarmi. Se questo è il caso (e si desidera AGGIORNARE la tabella anziché restituire solo risultati con documentazione), è possibile farlo:

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

È sulla buona strada, ma la sua soluzione manterrà i 4 caratteri all'inizio della stringa, anziché scartare i 4 caratteri.


9
questo fallirà per valori con <4 caratteri. È necessario aggiungere un blocco maiuscole per restituire il valore della colonna per <4.
Scott Ivey l'

2
Probabilmente il modo migliore per gestirlo sarebbe semplicemente: AGGIORNARE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 SUBSTRING non verrebbe fuori errore, ma avrebbe anche "inutilmente" aggiornato le righe con meno di quattro caratteri. Detto questo, l'OP ha indicato che volevano tagliare i primi 4 caratteri di una colonna specifica - suppongo che a meno che non venga fornito con maggiore dettaglio che TUTTE le righe devono essere tagliate.
Aaron Alton,

1
@ spencer7593 - hahaha ... vero. Puoi sempre aggiungere una clausola WHERE per sicurezza: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton,

È sicuro chiamare questo su una colonna NULL? Sarebbe successo in questo caso?
Ian R. O'Brien,

Ho finito per usare COL_LENGTH('MyTable', 'MyColumn')invece di LEN(MyColumn)perché nel mio caso volevo escludere i primi n caratteri, indipendentemente dalla dimensione del contenuto effettivo all'interno della colonna, ma questo ha funzionato bene a parte quello!
sfarbota,

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

Questo dice, a partire dalla prima 1posizione del personaggio, sostituire i 4personaggi con niente''


7
Vecchia domanda che conosco, ma preferisco questa soluzione, dal momento che non utilizza più di 1 funzione o ha un numero casuale grande in essa.
Edwin Stoteler,

4
Ancora di più: se someColumnè qualcosa di complesso come una sottoselezione da un CTE o qualcosa di simile, ciò non richiede di valutarlo due volte.
Jeff,

1
Cordiali saluti, questa soluzione funziona anche molto bene per tagliare i valori numerici.
Steven Ball,

1
per aumentare quello che hai detto, ecco un risultato completo. per prima cosa, seleziona, assicurati di ottenere le righe desiderate, quindi procedi nel modo corretto in questo aggiornamento. NOTA / attenzione: dopo aver eseguito correttamente non eseguirlo di nuovo, poiché interrompe in modo indiscriminato i primi 4 caratteri: aggiorna la tabella impostata textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) dove activitytype = 'A' e approveddate> '2017-06-30' e textField non come '% The County1%' e textField non come '% The County2%' e abstract non come '% The County3%') e activityid in (12345, ... range of id's ...
56789

33

Perché usare LEN in modo da avere 2 funzioni di stringa? Tutto ciò che serve è il personaggio 5 su ...

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

1
Questa è una prova per il futuro? È possibile che le future versioni di MSSQL possano utilizzare una dimensione varchar massima superiore a 8.000?
Web sviluppatore

3
varchar (max) è già più grande di 8000 caratteri. Se metti len (colonna) funzionerà per sempre però
Gaspa79,

2
O semplicemente usa 2000000000. Perché aggiungere una funzione LEN. Non aggiunge alcun valore e ignora anche gli spazi finali (se li desideri)
gbn

1
Grazie, questo ha funzionato bene per me come una cosa una tantum. La risposta accettata è stata per qualche motivo tagliare alcuni personaggi in alcuni casi, ma questo funziona perfettamente.
user2366842

2
@ user2366842 Il probabile motivo per cui usare la risposta accettata è stato tagliare caratteri aggiuntivi è che probabilmente hai spazi finali nel testo. Se lo desideri, puoi compensare utilizzando RTRIM e LTRIM.
Spazmoose

13

Prova questo:

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

7

Ecco un semplice modello di ciò che stai cercando di fare :)

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)

Quindi, usa l'ultima istruzione contro il campo che vuoi tagliare :)

La funzione SUBSTRING abbassa Code1, iniziando dal FIFTH e proseguendo per la lunghezza di CODE1 meno 4 (il numero di caratteri saltato all'inizio).


5

La cosa completa

DECLARE @v varchar(10)

SET @v='#temp'

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

3

Puoi farlo anche in SQL ..

substring(StudentCode,4,len(StudentCode))

sintassi

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

3

Prova questo. 100% funzionante

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

  


3

La risposta migliore non è adatta quando i valori possono avere una lunghezza inferiore a 4.

In T-SQL

Otterrai "Parametro di lunghezza non valido passato alla funzione corretta" perché non accetta i negativi. Utilizzare un'istruzione CASE:

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

In Postgres

I valori inferiori a 4 danno il comportamento sorprendente di seguito invece di un errore, poiché il passaggio di valori negativi a DESTRA taglia i primi caratteri anziché l'intera stringa. RIGHT(MyColumn, -5)Invece ha più senso usare .

Un esempio che confronta ciò che ottieni quando usi la "lunghezza - 5" della risposta superiore anziché "-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
Quale database usi? La domanda ha tag tsql, ma T-SQL non consente parametri negativi. Viene visualizzato il messaggio di errore "Parametro di lunghezza non valido passato alla funzione corretta."
palota,

Non ho notato i tag. Dividi la risposta in sezioni T-SQL e Postgres. Grazie.
Noumenon,


2

Sarebbe bene condividere, per DB2 usare: INSERT(someColumn, 1, 4, '')

Stuff non è supportato in DB2


1

Se devi rimuovere i primi pochi caratteri che sono preceduti da un carattere speciale come #, questo è buono:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.