Làm cách nào để xóa các ký tự đầu tiên của một cột cụ thể trong bảng?


160

Trong SQL, làm cách nào tôi có thể xóa 4 ký tự đầu tiên của các giá trị của một cột cụ thể trong một bảng? Tên cột là Student Codevà giá trị mẫu là ABCD123Stu1231. Tôi muốn xóa 4 ký tự đầu tiên khỏi bảng của mình cho tất cả các bản ghi

Xin vui lòng hướng dẫn cho tôi

Câu trả lời:


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

Chỉnh sửa: Để giải thích, RIGHT lấy 2 đối số - chuỗi (hoặc cột) để hoạt động và số lượng ký tự sẽ trả về (bắt đầu từ phía "bên phải" của chuỗi). LEN trả về độ dài của dữ liệu cột và chúng tôi trừ bốn để hàm RIGHT của chúng tôi để lại 4 ký tự ngoài cùng bên trái "phía sau".

Hy vọng điều này có ý nghĩa.

Chỉnh sửa lại - Tôi vừa đọc phản hồi của Andrew, và anh ta rất có thể đã xen kẽ chính xác, và tôi có thể bị nhầm lẫn. Nếu đây là trường hợp (và bạn muốn CẬP NHẬT bảng thay vì chỉ trả về kết quả đã được chứng minh), bạn có thể làm điều này:

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

Anh ấy đi đúng hướng, nhưng giải pháp của ông sẽ giữ 4 nhân vật lúc bắt đầu của chuỗi, chứ không phải ném bỏ nói 4 ký tự.


9
điều này sẽ thất bại đối với các giá trị có <4 ký tự. Bạn nên thêm một khối trường hợp để trả về giá trị của cột cho <4.
Scott Ivey

2
Có thể cách tốt nhất để xử lý nó đơn giản là: CẬP NHẬT MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 Việc SUBSTRING không bị lỗi, nhưng nó cũng không cần thiết phải "cập nhật" với ít hơn bốn ký tự. Điều đó nói rằng, OP chỉ ra rằng họ muốn cắt bớt 4 ký tự đầu tiên của một cột cụ thể - tôi sẽ giả sử trừ khi được cung cấp chi tiết hơn rằng TẤT CẢ các hàng cần phải được cắt bớt.
Aaron Alton

1
@ spencer7593 - hahaha ... đúng. Bạn luôn có thể thêm mệnh đề WHERE để an toàn: WHERE KHÔNG ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton

Có an toàn để gọi điều này trên một cột NULL? Sẽ xảy ra trong trường hợp này?
Ian R. O'Brien

Tôi đã kết thúc việc sử dụng COL_LENGTH('MyTable', 'MyColumn')thay LEN(MyColumn)vì bởi vì trong trường hợp của tôi, tôi muốn loại trừ n ký tự đầu tiên bất kể kích thước của nội dung thực tế trong cột, nhưng điều này hoạt động tốt hơn thế!
sfarbota

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

Điều này nói rằng, bắt đầu với 1vị trí ký tự đầu tiên , thay thế các 4ký tự không có gì''


7
Tôi biết câu hỏi cũ, nhưng tôi thích giải pháp này hơn, vì nó không sử dụng nhiều hơn 1 hàm hoặc có một số lượng lớn ngẫu nhiên trong đó.
Edwin Stoteler

4
Thậm chí nhiều hơn: nếu someColumnmột cái gì đó phức tạp như một phần phụ từ CTE hoặc một số thứ gì đó, thì điều này không yêu cầu đánh giá nó hai lần.
Jeff

1
FYI, giải pháp này cũng hoạt động thực sự tốt để cắt xén các giá trị số.
Steven Ball

1
để tăng thêm những gì bạn nói, đây là một kết quả hoàn thành. Đầu tiên, chọn và đảm bảo bạn nhận được các hàng bạn muốn, sau đó lấy ngay trong Bản cập nhật này. LƯU Ý / hãy cẩn thận - sau khi nó chạy thành công, đừng chạy lại, vì nó cắt bừa bãi 4 ký tự đầu tiên: bảng cập nhật đặt textField = (CHỌN STUFF (CHUYỂN ĐỔI (VARCHAR (MAX), textField), 1, 4, '')) trong đó Activitytype = 'A' và được phê duyệt> '2017-06-30' và textField không giống như '% The County1%' và textField không giống như '% The County2%' và trừu tượng không giống như '% The County3%') và hoạt động trong (12345, ... phạm vi của id ... 56789)
dcparham

33

Tại sao sử dụng LEN để bạn có 2 hàm chuỗi? Tất cả những gì bạn cần là nhân vật 5 trên ...

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

1
Đây có phải là bằng chứng trong tương lai? Có thể các phiên bản tương lai của MSSQL có thể sử dụng kích thước varchar tối đa lớn hơn 8.000 không?
Webs dành cho nhà phát triển

3
varchar (max) đã lớn hơn 8000 ký tự. Nếu bạn đặt len ​​(cột) thì nó sẽ hoạt động mãi mãi
Gaspa79

2
Hoặc chỉ sử dụng 2000000000. Tại sao thêm chức năng LEN. Không có giá trị và cũng bỏ qua các khoảng trắng ở cuối (nếu bạn muốn chúng)
gbn

1
Cảm ơn, điều này làm việc tốt cho tôi như là một điều một lần. Câu trả lời được chấp nhận là vì một số lý do cắt các ký tự bổ sung trong một số trường hợp, nhưng điều này hoạt động hoàn hảo.
dùng2366842

2
@ user2366842 Lý do có thể khiến việc sử dụng câu trả lời được chấp nhận là cắt bỏ các ký tự bổ sung là bạn có thể có dấu cách trong văn bản của mình. Bạn có thể bù cho điều đó nếu bạn muốn bằng cách sử dụng RTRIM & LTRIM.
Spazmoose

13

Thử cái này:

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

7

Đây là một mô phỏng đơn giản về những gì bạn đang cố gắng làm :)

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)

Vì vậy, sử dụng câu lệnh cuối cùng chống lại trường bạn muốn cắt :)

Hàm SUBSTRING cắt xuống Code1, bắt đầu từ ký tự NĂM và tiếp tục với độ dài CODE1 nhỏ hơn 4 (số lượng ký tự được bỏ qua khi bắt đầu).


5

Điều hoàn chỉnh

DECLARE @v varchar(10)

SET @v='#temp'

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

3

Bạn cũng có thể làm điều này trong SQL ..

substring(StudentCode,4,len(StudentCode))

cú pháp

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

3

Thử cái này. Làm việc 100%

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

  


3

Câu trả lời hàng đầu không phù hợp khi các giá trị có thể có độ dài nhỏ hơn 4.

Trong T-SQL

Bạn sẽ nhận được "Tham số độ dài không hợp lệ được truyền cho đúng chức năng" bởi vì nó không chấp nhận phủ định. Sử dụng câu lệnh CASE:

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

Trong Postgres

Các giá trị nhỏ hơn 4 đưa ra hành vi đáng ngạc nhiên bên dưới thay vì lỗi, bởi vì việc chuyển các giá trị âm sang RIGHT cắt các ký tự đầu tiên thay vì toàn bộ chuỗi. Nó có ý nghĩa hơn để sử dụng RIGHT(MyColumn, -5)thay thế.

Một ví dụ so sánh những gì bạn nhận được khi bạn sử dụng "độ dài - 5" của câu trả lời hàng đầu thay vì "-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
Bạn sử dụng cơ sở dữ liệu nào? Câu hỏi có thẻ tsql, nhưng T-SQL không cho phép các tham số âm. Tôi nhận được thông báo lỗi "Tham số độ dài không hợp lệ được truyền cho đúng chức năng."
palota

Tôi đã không nhận thấy các thẻ. Chia câu trả lời thành các phần T-SQL và Postgres. Cảm ơn bạn.
Noumenon


2

Nó sẽ là tốt để chia sẻ, Đối với sử dụng DB2: INSERT(someColumn, 1, 4, '')

Stuff không được hỗ trợ trong DB2


1

Nếu bạn phải loại bỏ một vài ký tự đầu tiên có trước một ký tự đặc biệt như thế #thì đây là một ký tự tốt:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.