Cách cắt ngắn chuỗi bằng máy chủ SQL


105

tôi có chuỗi lớn trong SQL Server. Tôi muốn cắt ngắn chuỗi đó còn 10 hoặc 15 ký tự

Chuỗi gốc

this is test string. this is test string. this is test string. this is test string.

Chuỗi mong muốn

this is test string. this is ......

1
"chuỗi mong muốn" của bạn chứa 28 ký tự từ "chuỗi gốc", không gần với "10 hoặc 15" mà bạn đang yêu cầu
KM.

Câu trả lời:


158

Nếu bạn chỉ muốn trả về một vài ký tự trong chuỗi dài của mình, bạn có thể sử dụng:

select 
  left(col, 15) + '...' col
from yourtable

Xem SQL Fiddle với Demo .

Thao tác này sẽ trả về 15 ký tự đầu tiên của chuỗi và sau đó nối ...phần cuối với phần cuối của nó.

Nếu bạn muốn đảm bảo rằng các chuỗi nhỏ hơn 15 không nhận được ...thì bạn có thể sử dụng:

select 
  case 
    when len(col)>=15
    then left(col, 15) + '...' 
    else col end col
from yourtable

Xem SQL Fiddle với Demo


2
nếu chuỗi ban đầu ít hơn 15 ký tự, bạn vẫn nhận được ...thêm vào khi nó không áp dụng
KM.

@KM. đã thêm một phiên bản sẽ kiểm tra độ dài chuỗi
Taryn

2
Nếu col có độ dài chính xác là 15 thì nó sẽ lấy toàn bộ chuỗi khi thực hiện left (col, 15) và sau đó đặt '...' ở cuối. Chắc chắn một giải pháp tốt hơn là kiểm tra 'khi len (col)> 15'.
Murphybro 2

35

Bạn có thể dùng

LEFT(column, length)

hoặc là

SUBSTRING(column, start index, length)

83
Câu hỏi SO này hiện là cách dễ nhất để tìm câu trả lời cho cách cắt ngắn một chuỗi trong tsql. Nếu người này đã không hỏi nó, sau đó tôi sẽ trawling thông qua một số bài viết MSDN và ghét cuộc sống của tôi ngay bây giờ ...
DMac Destroyer

4
@snaplemouton Có thể là "tệ" khi đặt câu hỏi về những điều đơn giản (như trong câu trả lời rất dễ tìm trước đây), nhưng dù sao thì kết quả cũng tốt. Ý tôi là SO có nghĩa là giữ câu trả lời cho tất cả các loại câu hỏi (ngay cả những câu hỏi về những thứ dễ tìm thấy khác).
jahu

8
@snaplemouton; Đoán xem, khi tìm kiếm câu hỏi / câu trả lời này nằm ở đầu kết quả giúp tôi tiết kiệm rất nhiều thời gian.
AMissico

9
Thêm vào đó, MSDN không cụm từ mô tả của một trong hai chức năng sử dụng từ TRUNCATE
pablete

4
@snaplemouton, tôi đã tìm thấy câu trả lời này trên Google. Vui lòng ngừng nói với mọi người về Google những điều trên StackOverflow, vì nhân viên Google trong tương lai sẽ thấy điều đó. Trang web này phần lớn tồn tại để hiển thị trong kết quả của Google.
Slothario

4

Tôi nghĩ câu trả lời ở đây rất tuyệt, nhưng tôi muốn thêm một tình huống.

Nhiều lần tôi đã muốn xóa một số lượng ký tự nhất định ở phía trước của một chuỗi mà không cần lo lắng về độ dài của nó. Có một số cách để thực hiện việc này với RIGHT () và SUBSTRING (), nhưng tất cả đều cần biết độ dài của chuỗi mà đôi khi có thể làm chậm mọi thứ.

Thay vào đó, tôi đã sử dụng hàm STUFF ():

SET @Result = STUFF(@Result, 1, @LengthToRemove, '')

Điều này thay thế độ dài của chuỗi không cần thiết bằng một chuỗi rỗng.


4

Bạn cũng có thể sử dụng thao tác Cast ():

 Declare @name varchar(100);
set @name='....';
Select Cast(@name as varchar(10)) as new_name

Tôi thích điều này nhất khi xuất ra tệp văn bản vì chỉ số ký tự mới được phân bổ cho cột đó trong tệp văn bản đầu ra. (ví dụ: 50 thay vì 1000) để có kết quả nhỏ gọn hơn.
BillDarcy

1

Bạn cũng có thể sử dụng bên dưới, iif tránh câu lệnh trường hợp và chỉ thêm dấu chấm lửng khi được yêu cầu (chỉ tốt trong SQL Server 2012 trở lên) và câu lệnh trường hợp tuân thủ ANSI hơn (nhưng dài dòng hơn)

SELECT 
  col, LEN(col), 
  col2, LEN(col2), 
  col3, LEN(col3) FROM (
  SELECT 
    col, 
    LEFT(x.col, 15) + (IIF(len(x.col) > 15, '...', '')) AS col2, 
    LEFT(x.col, 15) + (CASE WHEN len(x.col) > 15 THEN '...' ELSE '' END) AS col3 
  from (
      select 'this is a long string. One that is longer than 15 characters' as col
      UNION 
      SELECT 'short string' AS col
      UNION 
      SELECT 'string==15 char' AS col
      UNION 
      SELECT NULL AS col
      UNION 
      SELECT '' AS col
) x
) y

0
     CASE
     WHEN col IS NULL
        THEN ''
     ELSE SUBSTRING(col,1,15)+ '...' 
     END AS Col
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.