ฉันจะลบอักขระแรกของคอลัมน์ที่ระบุในตารางได้อย่างไร


162

ใน SQL ฉันจะลบ 4 อักขระแรกของค่าของคอลัมน์ที่ระบุในตารางได้อย่างไร ชื่อคอลัมน์และค่าตัวอย่างคือStudent Code ABCD123Stu1231ฉันต้องการลบ 4 ตัวอักษรแรกจากตารางของฉันสำหรับบันทึกทั้งหมด

กรุณาแนะนำฉัน

คำตอบ:


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

แก้ไข: เพื่ออธิบาย RIGHT รับอาร์กิวเมนต์ 2 ตัวคือสตริง (หรือคอลัมน์) เพื่อดำเนินการและจำนวนอักขระที่จะส่งคืน (เริ่มที่ด้าน "ขวา" ของสตริง) LEN ส่งคืนความยาวของข้อมูลคอลัมน์และเราลบสี่เพื่อให้ฟังก์ชั่น RIGHT ของเราปล่อยให้อักขระ 4 ตัวซ้ายสุด "หลัง"

หวังว่ามันจะสมเหตุสมผล

แก้ไขอีกครั้ง - ฉันเพิ่งอ่านคำตอบของแอนดรูว์และเขาอาจทำงานผิดพลาดได้อย่างถูกต้องและฉันอาจเข้าใจผิด หากเป็นกรณีนี้ (และคุณต้องการอัปเดตตารางแทนที่จะส่งคืนผลลัพธ์แบบแพทย์) คุณสามารถทำสิ่งนี้ได้:

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

เขาอยู่ในเส้นทางที่ถูกต้อง แต่วิธีแก้ปัญหาของเขาจะเก็บอักขระ 4 ตัวไว้ที่จุดเริ่มต้นของสายอักขระแทนที่จะละทิ้งอักขระ 4 ตัวที่กล่าวไว้


9
สิ่งนี้จะล้มเหลวสำหรับค่าที่มี <4 ตัวอักษร คุณควรเพิ่ม case block เพื่อส่งคืนค่าของคอลัมน์สำหรับ <4
Scott Ivey

2
น่าจะเป็นวิธีที่ดีที่สุดในการจัดการ: เพียง UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHEN LEN (MyColumn)> 4 SUBSTRING จะไม่เกิดข้อผิดพลาด ที่มีอักขระน้อยกว่าสี่ตัว ที่กล่าวว่า OP ระบุว่าพวกเขาต้องการตัด 4 อักขระแรกของคอลัมน์ที่ระบุ - ฉันจะสมมติว่ามีการให้รายละเอียดมากขึ้นว่าทุกแถวจำเป็นต้องถูกตัดแต่ง
Aaron Alton

1
@ spencer7593 - ฮ่าฮ่าฮ่า ... จริง คุณสามารถเพิ่มส่วนคำสั่ง WHERE ให้ปลอดภัยได้เสมอ: WHERE NOT ISNUMERIC (ซ้าย (MyColumn, 1))
Aaron Alton

มันปลอดภัยที่จะเรียกสิ่งนี้ในคอลัมน์ NULL หรือไม่? จะเกิดอะไรขึ้นในกรณีนี้?
Ian R. O'Brien

ฉันลงเอยด้วยการใช้COL_LENGTH('MyTable', 'MyColumn')แทนที่จะเป็นLEN(MyColumn)เพราะในกรณีของฉันฉันต้องการยกเว้นอักขระ n ตัวแรกไม่ว่าขนาดของเนื้อหาจริงภายในคอลัมน์จะเป็นเท่าไหร่ แต่สิ่งนี้ใช้ได้ดีกว่านี้!
sfarbota

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

สิ่งนี้บอกว่าเริ่มต้นด้วย1ตำแหน่งตัวอักษรตัวแรกแทนที่4ตัวอักษรด้วยอะไร''


7
คำถามเก่า ๆ ที่ฉันรู้ แต่ฉันชอบวิธีนี้มากกว่าเพราะมันไม่ได้ใช้มากกว่า 1 ฟังก์ชั่นหรือมีเลขสุ่มจำนวนมาก
Edwin Stoteler

4
ยิ่งไปกว่านั้น: หากsomeColumnมีบางสิ่งที่ซับซ้อนเช่นการเลือกย่อยจาก CTE หรือบางสิ่งบางอย่างสิ่งนี้ไม่จำเป็นต้องประเมินอีกสองครั้ง
Jeff

1
FYI โซลูชันนี้ยังทำงานได้ดีสำหรับการตัดค่าตัวเลข
Steven Ball

1
เพื่อเพิ่มสิ่งที่คุณพูดนี่คือผลลัพธ์ที่สมบูรณ์ ก่อนอื่นทำการเลือกให้แน่ใจว่าคุณได้แถวที่คุณต้องการจากนั้นรับสิทธิ์นั้นในการอัปเดตนี้ หมายเหตุ / ระวัง - หลังจากที่มันรันได้สำเร็จอย่ารันมันอีกครั้งเพราะมันจะตัด 4 chars แรกโดยไม่ จำกัด : update table set textField = (เลือก STUFF (แปลง (VARCHAR (MAX), textField), 1, 4, '') โดยที่ activitytype = 'A' และอนุมัติ> '2017-06-30' และ textField ไม่เหมือนกับ '% The County1%' และ textField ไม่เหมือนกับ '% The County2%' และบทคัดย่อไม่เหมือน '% The County3%') และ activityid ใน (12345, ... ช่วงของ id ... 56789)
dcparham

33

เหตุใดจึงต้องใช้ LEN คุณจึงมี 2 ฟังก์ชั่นสตริง สิ่งที่คุณต้องการคือตัวละคร 5 บน ...

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

1
นี่เป็นข้อพิสูจน์ในอนาคตหรือไม่ เป็นไปได้หรือไม่ที่ MSSQL รุ่นอนาคตอาจใช้ขนาด varchar สูงสุดมากกว่า 8,000
นักพัฒนาเว็บ

3
varchar (สูงสุด) มากกว่า 8000 ตัวอักษรอยู่แล้ว หากคุณใส่ len (คอลัมน์) มันจะทำงานได้ตลอดแม้ว่า
Gaspa79

2
หรือแค่ใช้ 2000000000 ทำไมเพิ่มฟังก์ชั่น LEN ไม่เพิ่มค่าใด ๆ และยังละเว้นช่องว่างต่อท้าย (ถ้าคุณต้องการ)
gbn

1
ขอบคุณสิ่งนี้ใช้ได้ผลดีสำหรับฉันในครั้งเดียว คำตอบที่ได้รับการยอมรับคือเหตุผลที่สับอักขระเพิ่มเติมในบางกรณี แต่วิธีนี้ใช้ได้อย่างไม่มีที่ติ
user2366842

2
@ user2366842 สาเหตุที่เป็นไปได้ว่าทำไมการใช้คำตอบที่ได้รับการยอมรับคือการตัดอักขระเพิ่มเติมออกมาคือคุณอาจมีช่องว่างต่อท้ายในข้อความของคุณ คุณสามารถชดเชยสิ่งนั้นได้หากคุณต้องการโดยใช้ RTRIM & LTRIM
Spazmoose


7

นี่เป็นตัวอย่างง่ายๆของสิ่งที่คุณพยายามทำ :)

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)

ดังนั้นใช้คำสั่งสุดท้ายกับฟิลด์ที่คุณต้องการตัดแต่ง :)

ฟังก์ชั่น SUBSTRING ตัดขอบ Code1 เริ่มต้นที่ตัวอักษร FIFTH และดำเนินการต่อไปตามความยาวของ CODE1 น้อยกว่า 4 (จำนวนอักขระที่ข้ามไปเมื่อเริ่มต้น)



3

คุณสามารถทำได้ใน SQL

substring(StudentCode,4,len(StudentCode))

วากยสัมพันธ์

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


3

คำตอบยอดนิยมไม่เหมาะเมื่อค่าอาจมีความยาวน้อยกว่า 4

ใน T-SQL

คุณจะได้รับ "พารามิเตอร์ความยาวไม่ถูกต้องถูกส่งไปยังฟังก์ชั่นที่ถูกต้อง" เพราะไม่ยอมรับการปฏิเสธ ใช้คำสั่ง CASE:

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

ใน Postgres

ค่าน้อยกว่า 4 ให้พฤติกรรมที่น่าแปลกใจด้านล่างแทนข้อผิดพลาดเพราะการส่งค่าลบไปยัง RIGHT จะตัดอักขระตัวแรกแทนทั้งสตริง มันสมเหตุสมผลมากกว่าที่จะใช้RIGHT(MyColumn, -5)แทน

ตัวอย่างการเปรียบเทียบสิ่งที่คุณได้รับเมื่อคุณใช้ "length - 5" ของคำตอบสูงสุดแทน "-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
คุณใช้ฐานข้อมูลใด คำถามมีแท็ก tsql แต่ T-SQL ไม่อนุญาตให้ใช้พารามิเตอร์เชิงลบ ฉันได้รับข้อความแสดงข้อผิดพลาด "พารามิเตอร์ความยาวไม่ถูกต้องถูกส่งไปยังฟังก์ชันที่เหมาะสม"
palota

ฉันไม่ได้สังเกตแท็ก แบ่งคำตอบลงใน T-SQL และส่วน Postgres ขอบคุณ.
Noumenon

2

มีฟังก์ชั่นการตัดแต่งในตัวที่สมบูรณ์แบบสำหรับวัตถุประสงค์

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

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


1
แม้ว่าสิ่งนี้อาจเป็นประโยชน์สำหรับผู้ใช้ PostgreSQL แต่ OP ระบุ tsql / sql-server ในแท็กคำถาม
CodeMonkey1313


1

หากคุณต้องลบอักขระสองสามตัวแรกที่นำหน้าด้วยอักขระพิเศษเช่น#นี้เป็นสิ่งที่ดี:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.