Tablodaki belirli bir sütunun ilk karakterlerini nasıl kaldırabilirim?


162

SQL'de, bir tablodaki belirli bir sütunun değerlerinin ilk 4 karakterini nasıl kaldırabilirim? Sütun adı Student Codeve bir örnek değer ABCD123Stu1231. Tüm kayıtlar için tablodan ilk 4 karakteri kaldırmak istiyorum

Lütfen bana yol göster

Yanıtlar:


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

Düzenleme: Açıklamak için, SAĞ 2 argüman alır - üzerinde çalışacak dize (veya sütun) ve döndürülecek karakter sayısı (dizenin "sağ" tarafında başlayarak). LEN sütun verilerinin uzunluğunu döndürür ve SAĞ fonksiyonumuzun en soldaki 4 karakteri "geride" bırakması için dördü çıkarırız.

Umarım bu mantıklıdır.

Tekrar düzenleyin - Andrew'un yanıtını okudum ve doğru şekilde çok iyi yorumlanmış olabilir ve yanılmış olabilirim. Durum buysa (ve yalnızca doktor sonuçları döndürmek yerine tabloyu GÜNCELLEMEK istiyorsanız) bunu yapabilirsiniz:

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

Doğru yolda, ancak çözümü 4 karakteri, dizinin başında tutar, söz konusu 4 karakteri atmak yerine tutacaktır .


9
<4 karakter içeren değerler için bu başarısız olur. <4 sütununun değerini döndürmek için bir vaka bloğu eklemelisiniz.
Scott Ivey

2
Muhtemelen işlemek için en iyi yol: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) NEREDE LEN (MyColumn)> 4 SUBSTRING hata vermez, ancak gereksiz yere "güncelleme" satırları dört karakterden az. Bununla birlikte, OP, belirli bir sütunun ilk 4 karakterini kırpmak istediklerini belirtti - TÜM satırların kesilmesi gerektiğine dair daha fazla ayrıntı sağlanmadıkça varsayıyorum.
Aaron Alton

1
@ spencer7593 - hahaha ... doğru. NEREDE DEĞİL vererek isNumeric öğesinin (SOL (Sütunum, 1)): Her zaman güvenli olması için bir WHERE yan tümcesini ekleyebilirsiniz
Aaron Alton

Bunu NULL sütununda çağırmak güvenli mi? Bu durumda olur mu?
Ian R. O'Brien

Bunun COL_LENGTH('MyTable', 'MyColumn')yerine kullanmak LEN(MyColumn)zorunda kaldım çünkü benim durumumda, sütundaki gerçek içeriğin boyutu ne olursa olsun ilk n karakteri hariç tutmak istedim, ancak bu bundan başka iyi çalıştı!
sfarbota

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

Bu, ilk 1karakter konumundan başlayarak 4karakterleri hiçbir şeyle değiştirmez''


7
Eski soru biliyorum, ama bu çözümü tercih ediyorum, çünkü 1'den fazla işlev kullanmıyor veya içinde rastgele çok sayıda var.
Edwin Stoteler

4
Dahası: someColumnbir CTE veya bir şeyden bir alt seçim gibi karmaşık bir şeyse, bunun iki kez değerlendirilmesini gerektirmez.
Jeff

1
FYI, bu çözüm aynı zamanda sayısal değerleri kesmek için de çok iyi çalışıyor.
Steven Ball

1
söylediklerinizi arttırmak için tamamlanmış bir sonuç. önce bir seçim yapın, istediğiniz satırları aldığınızdan emin olun, ardından bu Güncelleme'de doğru olanı alın. NOT / dikkatli olun - başarıyla çalıştıktan sonra tekrar çalıştırmayın, çünkü ilk 4 karakteri rastgele keser: güncelleme tablo seti textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) etkinlik türü = 'A' ve onaylı veri> '2017-06-30' ve textField '% The County1%' gibi değil ve textField '% The County2%' gibi değil ve özet '% The County3%' gibi değil ve (12345, ...
id'nin

33

Neden 2 dize fonksiyonuna sahip olmak için LEN kullanıyorsunuz? Tek ihtiyacınız olan karakter 5 ...

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

1
Bu geleceğin kanıtı mı? MSSQL'in gelecekteki sürümlerinde 8.000'den büyük bir maksimum varchar boyutu kullanılabilir mi?
Geliştirici Webs

3
varchar (max) zaten 8000 karakterden büyük. Eğer len (sütun) koyarsanız sonsuza kadar çalışır
Gaspa79

2
Ya da sadece 2000000000 kullanın. Neden bir LEN işlevi eklemelisiniz. Değer katmaz ve sondaki boşlukları yoksayar (isterseniz)
gbn

1
Teşekkürler, bu bir kereye mahsus bir şey olarak benim için iyi çalıştı. Kabul edilen cevap bir nedenden dolayı bazı durumlarda ek karakterleri doğramaktı, ancak bu kusursuz bir şekilde çalışıyor.
user2366842

2
@ user2366842 Kabul edilen yanıtı kullanmanın ek karakterleri kesmesinin olası nedeni, metninizde büyük olasılıkla boşluk bırakmış olmanızdır. RTRIM & LTRIM'i kullanarak bunu telafi edebilirsiniz.
Spazmoose

13

Bunu dene:

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

7

İşte yapmaya çalıştığınız şeyin basit bir maketi:

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)

Bu nedenle, kırpmak istediğiniz alana karşı son ifadeyi kullanın :)

SUBSTRING işlevi, FIFTH karakterinden başlayarak ve CODE1 daha az 4 (başlangıçta atlanan karakter sayısı) boyunca devam ederek Code1'i keser.


5

Komple şey

DECLARE @v varchar(10)

SET @v='#temp'

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

3

Bunu SQL'de de yapabilirsiniz ..

substring(StudentCode,4,len(StudentCode))

sözdizimi

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

3

Bunu dene. % 100 çalışma

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

  


3

Değerlerin 4'ten az olabileceği durumlarda üst yanıt uygun değildir.

T-SQL'de

Negatifleri kabul etmediği için "Doğru işleve geçersiz uzunluk parametresi iletildi" iletisini alırsınız. Bir CASE deyimi kullanın:

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

Postgres'te

4'ten küçük değerler hata yerine aşağıdaki şaşırtıcı davranışı verir, çünkü negatif değerleri SAĞ değerine geçirmek dizenin tamamı yerine ilk karakterleri keser. Bunun RIGHT(MyColumn, -5)yerine kullanımı daha mantıklı .

"-5" yerine en çok yanıt alanın "uzunluk - 5" ifadesini kullandığınızda karşılaşanları karşılaştıran bir örnek:

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
Hangi veritabanını kullanıyorsunuz? Sorunun tsql etiketi var, ancak T-SQL negatif parametrelere izin vermiyor. "Doğru işleve geçersiz uzunluk parametresi geçildi" hata iletisini alıyorum.
palota

Etiketleri fark etmedim. Cevabı T-SQL ve Postgres bölümlerine ayırın. Teşekkür ederim.
Noumenon


2

DB2 kullanımı için paylaşmak iyi olur: INSERT(someColumn, 1, 4, '')

Stuff DB2'de desteklenmiyor


1

Önce özel bir karakterin bulunduğu ilk birkaç karakteri kaldırmanız gerekiyorsa #, bu iyi bir karakterdir :

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.