Jak usunąć pierwsze znaki z określonej kolumny w tabeli?

162

W SQL, jak mogę usunąć pierwsze 4 znaki wartości określonej kolumny w tabeli? Nazwa kolumny to, Student Codea przykładowa wartość to ABCD123Stu1231. Chcę usunąć pierwsze 4 znaki z mojej tabeli dla wszystkich rekordów

Proszę, prowadź mnie

Shyju
źródło

Odpowiedzi:

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

Edycja: Aby wyjaśnić, PRAWO przyjmuje 2 argumenty - ciąg (lub kolumnę), na którym ma działać, i liczbę znaków do zwrócenia (zaczynając od „prawej” strony ciągu). LEN zwraca długość danych kolumny, a my odejmujemy cztery, tak aby funkcja PRAWO pozostawiła cztery skrajne lewe znaki „za”.

Mam nadzieję, że to ma sens.

Edytuj ponownie - właśnie przeczytałem odpowiedź Andrew i mógł on zinterpretować poprawnie, i mogę się mylić. W takim przypadku (i chcesz ZAKTUALIZOWAĆ tabelę, a nie tylko zwracać spreparowane wyniki), możesz to zrobić:

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

Jest na dobrej drodze, ale jego rozwiązanie zachowa 4 znaki na początku ciągu, zamiast odrzucać wspomniane 4 znaki.

Aaron Alton
źródło
9
zakończy się to niepowodzeniem dla wartości zawierających <4 znaki. Powinieneś dodać blok case, aby zwrócić wartość kolumny dla <4.
Scott Ivey,
2
Prawdopodobnie najlepszym sposobem na jego obsługę byłoby po prostu: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 PODCIĄG nie powodowałby błędu, ale również niepotrzebnie „aktualizował” wiersze z mniej niż czterema znakami. To powiedziawszy, OP wskazał, że chciał przyciąć pierwsze 4 znaki określonej kolumny - zakładam, że o ile nie podano bardziej szczegółowych informacji, WSZYSTKIE wiersze muszą zostać przycięte.
Aaron Alton
1
@ spencer7593 - hahaha ... prawda. Zawsze możesz dodać klauzulę WHERE dla bezpieczeństwa: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton,
Czy można to bezpiecznie nazwać w kolumnie NULL? Co by się stało w tym przypadku?
Ian R. O'Brien
Skończyło się na tym, że COL_LENGTH('MyTable', 'MyColumn')zamiast tego LEN(MyColumn)użyłem, ponieważ w moim przypadku chciałem wykluczyć pierwsze n znaków bez względu na rozmiar rzeczywistej zawartości w kolumnie, ale to działało dobrze poza tym!
sfarbota
86
Stuff(someColumn, 1, 4, '')

To mówi, zaczynając od pozycji pierwszego 1znaku, zamień 4znaki na nic''

AaronLS
źródło
7
Stare pytanie znam, ale wolę to rozwiązanie, ponieważ nie używa więcej niż 1 funkcji lub ma w sobie jakąś losową dużą liczbę.
Edwin Stoteler
4
Co więcej: jeśli someColumnjest to coś złożonego, jak podselekcja z CTE lub coś innego, nie wymaga to podwójnej oceny.
Jeff
1
FYI, to rozwiązanie działa również bardzo dobrze do przycinania wartości liczbowych.
Steven Ball
1
aby wzmocnić to, co powiedziałeś, oto pełny wynik. najpierw wybierz, upewnij się, że otrzymujesz żądane wiersze, a następnie zrób to dobrze w tej aktualizacji. UWAGA / uwaga - po pomyślnym uruchomieniu nie uruchamiaj go ponownie, ponieważ bezkrytycznie odcina pierwsze 4 znaki: aktualizacja tabeli set textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) gdzie activitytype = 'A' i zatwierdzonydate> '2017-06-30' i textField inne niż '% The County1%', a textField inne niż '% The County2%', a streszczenie inne niż '% The County3%') i activityid w (12345, ... zakres id ... 56789)
dcparham
33

Po co używać LEN, aby mieć 2 funkcje tekstowe? Potrzebujesz tylko postaci 5 na ...

...SUBSTRING (Code1, 5, 8000)...
gbn
źródło
1
Czy to dowód na przyszłość? Czy to możliwe, że przyszłe wersje MSSQL mogą używać maksymalnego rozmiaru varchar większego niż 8000?
Developer Webs
3
varchar (max) jest już większy niż 8000 znaków. Jeśli jednak umieścisz len (kolumna), to będzie działać wiecznie
Gaspa79
2
Lub po prostu użyj 2000000000. Po co dodawać funkcję LEN. Nie dodaje żadnej wartości, a także ignoruje końcowe spacje (jeśli je chcesz)
gbn
1
Dzięki, to zadziałało dla mnie jako jednorazowa rzecz. Zaakceptowaną odpowiedzią było z jakiegoś powodu wycinanie dodatkowych znaków w niektórych przypadkach, ale działa to bezbłędnie.
user2366842
2
@ user2366842 Prawdopodobnym powodem, dla którego przy użyciu zaakceptowanej odpowiedzi było obcięcie dodatkowych znaków, jest prawdopodobnie występowanie spacji na końcu tekstu. Możesz to zrekompensować, jeśli chcesz, używając RTRIM i LTRIM.
Spazmoose
13

Spróbuj tego:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);
Andrew Hare
źródło
7

Oto prosta makieta tego, co próbujesz zrobić :)

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)

Więc użyj ostatniej instrukcji w polu, które chcesz przyciąć :)

Funkcja SUBSTRING przycina w dół Code1, zaczynając od piątego znaku i kontynuując przez długość CODE1 minus 4 (liczba znaków pomijanych na początku).

Obrabować
źródło
5

Kompletna rzecz

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'
Higarian
źródło
3

Możesz to również zrobić w SQL ..

substring(StudentCode,4,len(StudentCode))

składnia

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)
Durgesh Pandey
źródło
3

Spróbuj tego. 100% sprawne

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

  

Ilyes
źródło
3

Górna odpowiedź nie jest odpowiednia, gdy wartości mogą mieć długość mniejszą niż 4.

W T-SQL

Otrzymasz komunikat „Nieprawidłowy parametr długości przekazany do właściwej funkcji”, ponieważ nie akceptuje ona wartości ujemnych. Użyj instrukcji CASE:

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

W Postgres

Wartości mniejsze niż 4 dają zaskakujące zachowanie poniżej zamiast błędu, ponieważ przekazanie wartości ujemnych do PRAWEGO pola przycina pierwsze znaki zamiast całego ciągu. RIGHT(MyColumn, -5)Zamiast tego lepiej jest użyć .

Przykład porównujący to, co otrzymujesz, stosując górną odpowiedź „długość - 5” zamiast „-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                           
Noumenon
źródło
1
Z jakiej bazy danych korzystasz? Pytanie ma tag tsql, ale T-SQL nie dopuszcza parametrów ujemnych. Otrzymuję komunikat o błędzie „Nieprawidłowy parametr długości przekazany do właściwej funkcji”.
palota
Nie zauważyłem tagów. Podziel odpowiedź na sekcje T-SQL i Postgres. Dziękuję Ci.
Noumenon
2

Jest wbudowana funkcja przycinania, która jest idealna do tego celu.

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

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

linuxatico
źródło
1
Chociaż może to być przydatne dla użytkowników PostgreSQL, OP określił serwer tsql / sql-server w znacznikach pytania.
CodeMonkey1313,
2

Byłoby dobrze udostępnić, Do użytku z DB2: INSERT(someColumn, 1, 4, '')

Stuff nie jest obsługiwany w DB2

Wspaniały Saif
źródło
1

Jeśli musisz usunąć kilka pierwszych znaków, które są poprzedzone znakiem specjalnym #, takim jak , to jest dobry:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Prachita
źródło