Bagaimana cara menghapus karakter pertama dari kolom tertentu dalam tabel?

162

Dalam SQL, bagaimana saya bisa menghapus 4 karakter pertama dari nilai kolom tertentu dalam sebuah tabel? Nama kolom adalah Student Codedan nilai contohnya adalah ABCD123Stu1231. Saya ingin menghapus 4 karakter pertama dari tabel saya untuk semua catatan

mohon bimbingannya

Shyju
sumber

Jawaban:

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

Sunting: Untuk menjelaskan, KANAN membutuhkan 2 argumen - string (atau kolom) untuk beroperasi, dan jumlah karakter untuk kembali (mulai dari sisi "kanan" dari string). LEN mengembalikan panjang data kolom, dan kami mengurangi empat sehingga fungsi KANAN kami meninggalkan 4 karakter paling kiri "di belakang".

Semoga ini masuk akal.

Sunting lagi - Saya baru saja membaca jawaban Andrew, dan dia mungkin telah melakukan interperperet dengan benar, dan saya mungkin salah. Jika ini masalahnya (dan Anda ingin memperbarui tabel daripada hanya mengembalikan hasil yang dipaksakan), Anda dapat melakukan ini:

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

Dia berada di jalur yang benar, tetapi solusinya akan menjaga 4 karakter di awal string, daripada membuang kata 4 karakter.

Aaron Alton
sumber
9
ini akan gagal untuk nilai dengan <4 karakter. Anda harus menambahkan blok kasus untuk mengembalikan nilai kolom untuk <4.
Scott Ivey
2
Kemungkinan cara terbaik untuk menanganinya adalah: MEMPERBARUI MyTableSET MyColumn = KANAN (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 SUBSTRING tidak akan keluar, tetapi juga tidak perlu "memperbarui" baris dengan kurang dari empat karakter. Yang mengatakan, OP menunjukkan bahwa mereka ingin memangkas 4 karakter pertama dari kolom tertentu - saya akan berasumsi kecuali diberikan dengan rincian yang lebih besar bahwa SEMUA baris perlu dipangkas.
Aaron Alton
1
@ spencer7593 - hahaha ... benar. Anda selalu dapat menambahkan klausa WHERE agar aman: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton
Apakah aman untuk menyebut ini pada kolom NULL? Apakah yang akan terjadi dalam kasus ini?
Ian R. O'Brien
Saya akhirnya menggunakan COL_LENGTH('MyTable', 'MyColumn')bukan LEN(MyColumn)karena dalam kasus saya saya ingin mengecualikan n karakter pertama tidak peduli ukuran konten aktual dalam kolom, tetapi ini bekerja dengan baik selain itu!
sfarbota
86
Stuff(someColumn, 1, 4, '')

Ini mengatakan, dimulai dengan 1posisi karakter pertama , ganti 4karakter dengan apa-apa''

AaronLS
sumber
7
Pertanyaan lama yang saya tahu, tetapi saya lebih suka solusi ini, karena tidak menggunakan lebih dari 1 fungsi atau memiliki sejumlah besar acak di dalamnya.
Edwin Stoteler
4
Bahkan lebih: jika someColumnsesuatu yang kompleks seperti subselect dari CTE atau somehting, ini tidak perlu dievaluasi dua kali.
Jeff
1
FYI, solusi ini juga bekerja sangat baik untuk memangkas nilai numerik.
Steven Ball
1
untuk menambah apa yang Anda katakan, inilah hasil yang lengkap. pertama, lakukan pemilihan, pastikan Anda mendapatkan baris yang Anda inginkan, lalu perbaiki di Pembaruan ini. CATATAN / berhati-hatilah - setelah berjalan dengan sukses jangan jalankan lagi, karena itu tanpa pandang bulu memotong 4 karakter pertama: perbarui set tabel textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) di mana activitytype = 'A' dan disetujuitanggal> '2017-06-30' dan textField tidak suka '% The County1%' dan textField tidak suka '% The County2%' dan abstrak tidak suka '% The County3%') dan activityid di (12345, ... rentang id ... 56789)
dcparham
33

Mengapa menggunakan LEN sehingga Anda memiliki 2 fungsi string? Yang Anda butuhkan adalah karakter 5 di ...

...SUBSTRING (Code1, 5, 8000)...
gbn
sumber
1
Apakah ini bukti masa depan? Apakah mungkin bahwa versi MSSQL di masa depan mungkin menggunakan ukuran max varchar lebih besar dari 8.000?
Pengembang Web
3
varchar (maks) sudah lebih besar dari 8000 karakter. Jika Anda meletakkan len (kolom) itu akan bekerja selamanya
Gaspa79
2
Atau cukup gunakan 2000000000. Mengapa menambahkan fungsi LEN. Menambahkan tidak ada nilai dan juga mengabaikan spasi tambahan (jika Anda mau)
gbn
1
Terima kasih, ini bekerja dengan baik untuk saya sebagai satu hal. Jawaban yang diterima adalah karena alasan tertentu memotong karakter tambahan dalam beberapa kasus, tetapi ini bekerja dengan sempurna.
user2366842
2
@ user2366842 Kemungkinan alasan mengapa menggunakan jawaban yang diterima memotong karakter tambahan adalah bahwa Anda mungkin memiliki spasi tambahan di teks Anda. Anda dapat mengompensasi itu jika Anda ingin menggunakan RTRIM & LTRIM.
Spazmoose
13

Coba ini:

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

Berikut ini mock-up sederhana dari apa yang Anda coba lakukan :)

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)

Jadi, gunakan pernyataan terakhir terhadap bidang yang ingin Anda pangkas :)

Fungsi SUBSTRING memangkas Code1, mulai dari karakter FIFTH, dan melanjutkan untuk panjang CODE1 kurang 4 (jumlah karakter dilewati di awal).

rampok
sumber
5

Hal Lengkap

DECLARE @v varchar(10)

SET @v='#temp'

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

Anda juga dapat melakukan ini dalam SQL ..

substring(StudentCode,4,len(StudentCode))

sintaksis

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

Coba ini. 100% berfungsi

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

  

Ilyes
sumber
3

Jawaban teratas tidak cocok ketika nilai mungkin memiliki panjang kurang dari 4.

Dalam T-SQL

Anda akan mendapatkan "Parameter panjang tidak valid diteruskan ke fungsi yang benar" karena tidak menerima negatif. Gunakan pernyataan KASUS:

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

Dalam Postgres

Nilai kurang dari 4 memberikan perilaku mengejutkan di bawah bukannya kesalahan, karena meneruskan nilai negatif ke KANAN akan memangkas karakter pertama dan bukan seluruh string. Lebih masuk akal untuk digunakan RIGHT(MyColumn, -5)sebagai gantinya.

Contoh membandingkan apa yang Anda dapatkan ketika Anda menggunakan jawaban "panjang - 5" jawaban atas daripada "-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
sumber
1
Database apa yang Anda gunakan? Pertanyaannya memiliki tag tsql, tetapi T-SQL tidak mengizinkan parameter negatif. Saya mendapatkan pesan kesalahan "Parameter panjang tidak valid diteruskan ke fungsi yang tepat."
palota
Saya tidak melihat tag. Pisahkan jawaban menjadi bagian T-SQL dan Postgres. Terima kasih.
Noumenon
2

Ada fungsi trim bawaan yang sempurna untuk tujuan tersebut.

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

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

linuxatico
sumber
1
Meskipun ini mungkin berguna untuk pengguna PostgreSQL, OP menentukan tsql / sql-server dalam tag pertanyaan.
CodeMonkey1313
2

Akan baik untuk dibagikan, Untuk penggunaan DB2: INSERT(someColumn, 1, 4, '')

Stuff tidak didukung dalam DB2

Saif Luar Biasa
sumber
1

Jika Anda harus menghapus beberapa karakter pertama yang didahului oleh karakter khusus seperti #, ini adalah yang baik:

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