วิธีการตัดสตริงโดยใช้เซิร์ฟเวอร์ SQL


106

ฉันมีสตริงขนาดใหญ่ใน SQL Server ฉันต้องการตัดทอนสตริงนั้นให้เหลือ 10 หรือ 15 อักขระ

สตริงเดิม

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

สตริงที่ต้องการ

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

1
"สตริงที่ต้องการ" ของคุณมี 28 อักขระจาก "สตริงเดิม" ไม่ใกล้เคียงกับ "10 หรือ 15" ที่คุณต้องการ
KM

คำตอบ:


160

หากคุณต้องการส่งคืนสตริงแบบยาวเพียงไม่กี่อักขระคุณสามารถใช้:

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

ดูซอ SQL กับการสาธิต

สิ่งนี้จะส่งคืนอักขระ 15 ตัวแรกของสตริงจากนั้นต่อ...ท้ายสตริงเข้าด้วยกัน

หากคุณต้องการตรวจสอบให้แน่ใจว่าสตริงที่น้อยกว่า 15 ไม่ได้รับ...คุณสามารถใช้:

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

ดูSQL Fiddle พร้อมการสาธิต


2
หากสตริงเดิมน้อยกว่า 15 อักขระคุณจะยังคงได้รับการ...ต่อท้ายเมื่อไม่มีผล
KM

@ กม. เพิ่มเวอร์ชันที่จะตรวจสอบความยาวสตริง
Taryn

2
ถ้า col มีความยาวเท่ากับ 15 มันจะได้สตริงทั้งหมดเมื่อทำซ้าย (col, 15) แล้วใส่ '... ' ต่อท้าย แน่นอนทางออกที่ดีกว่าคือการตรวจสอบ 'เมื่อ len (col)> 15'
Murphybro2

36

คุณสามารถใช้ได้

LEFT(column, length)

หรือ

SUBSTRING(column, start index, length)

83
คำถาม SO นี้เป็นวิธีที่ง่ายที่สุดในการค้นหาคำตอบเกี่ยวกับวิธีตัดทอนสตริงใน tsql ถ้าคนนี้ไม่ได้ถามฉันก็จะอ่านบทความ MSDN และเกลียดชีวิตตัวเองในตอนนี้ ...
DMac the Destroyer

4
@snaplemouton มันอาจจะ "ไม่ดี" ที่ถามคำถามเกี่ยวกับเรื่องง่าย ๆ (เนื่องจากในคำตอบนั้นหาได้ง่ายมาก่อน) แต่ผลลัพธ์ก็ยังดีอยู่ดี ฉันหมายความว่า SO มีไว้เพื่อตอบคำถามทุกประเภท (แม้แต่คำถามที่ถามเกี่ยวกับสิ่งที่หาได้ง่าย)
jahu

8
@snaplemouton; เดาว่าเมื่อค้นหาคำถาม / คำตอบนี้อยู่ในอันดับต้น ๆ ของผลลัพธ์ซึ่งช่วยให้ฉันประหยัดเวลาได้มาก
AMissico

9
นอกจากนี้ MSDN ไม่ได้ระบุคำอธิบายของฟังก์ชันใดฟังก์ชันหนึ่งโดยใช้คำว่าTRUNCATE
pablete

4
@snaplemouton ฉันพบคำตอบนี้ใน Google โปรดหยุดบอกคนอื่น ๆ กับ Google ใน StackOverflow เนื่องจาก Googler ในอนาคตจะได้เห็น ไซต์นี้มีอยู่เป็นส่วนใหญ่เพื่อแสดงในผลการค้นหาของ Google
Slothario

4

ฉันคิดว่าคำตอบตรงนี้ดีมาก แต่ฉันต้องการเพิ่มสถานการณ์

หลายครั้งฉันต้องการนำอักขระจำนวนหนึ่งออกจากด้านหน้าของสตริงโดยไม่ต้องกังวลเกี่ยวกับความยาว มีหลายวิธีในการดำเนินการกับ RIGHT () และ SUBSTRING () แต่ทุกคนจำเป็นต้องทราบความยาวของสตริงซึ่งบางครั้งอาจทำให้สิ่งต่างๆช้าลงได้

ฉันใช้ฟังก์ชัน STUFF () แทน:

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

สิ่งนี้จะแทนที่ความยาวของสตริงที่ไม่จำเป็นด้วยสตริงว่าง


4

คุณยังสามารถใช้การดำเนินการ Cast ():

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

ฉันชอบอันนี้ที่สุดเมื่อส่งออกไปยังไฟล์ข้อความเพราะมีการจัดสรรจำนวนอักขระใหม่ให้กับคอลัมน์นั้นในไฟล์ข้อความผลลัพธ์เท่านั้น (เช่น 50 แทน 1,000) เพื่อผลลัพธ์ที่กะทัดรัดยิ่งขึ้น
BillDarcy

1

คุณยังสามารถใช้ด้านล่าง iif หลีกเลี่ยงคำสั่ง case และเพิ่มจุดไข่ปลาเมื่อจำเป็นเท่านั้น (ใช้ได้ดีใน SQL Server 2012 และใหม่กว่าเท่านั้น) และคำสั่ง case เป็นไปตาม ANSI มากกว่า (แต่มีรายละเอียดมากกว่า)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.