首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 字串截斷顯示固定長度:CASE + SUBSTRING 實作「超過長度顯示省略號」通用模式

     編輯:MySQL 資料庫相關知識

報表、清單頁常需將長標題、內容截斷顯示,超過長度以「...」取代。本文提供通用的 CASE + SUBSTRING 模式,可直接套用於 SELECT 清單,支援任意欄位、任意長度閾值。

核心語法模式

SELECT 
  ArticleTitle = CASE 
    WHEN LEN(ArticleTitle) > 11 
    THEN SUBSTRING(ArticleTitle, 1, 11) + '...' 
    ELSE ArticleTitle 
  END,
  ArticleTime,
  ArticleContent = CASE 
    WHEN LEN(ArticleContent) > 30 
    THEN SUBSTRING(ArticleContent, 1, 30) + '...' 
    ELSE ArticleContent 
  END
FROM Article
ORDER BY ArticleTime DESC;

關鍵函數說明

函數用途注意
LEN(str)取得字串長度 (不含尾隨空格)若需含空格長度用 DATALENGTH/2 (Unicode)
SUBSTRING(str, start, length)擷取子字串,**起始位置從 1 算起**非 0-based,SUBSTRING(str, 1, 11) 取前 11 字
CASE WHEN ... THEN ... ELSE ... END條件邏輯,回傳截斷或原值可巢狀、多條件

進階變體

1. 使用 LEFT 簡化 (同義)

CASE WHEN LEN(col) > 20 THEN LEFT(col, 20) + '...' ELSE col END

2. 依位元組長度截斷 (雙位元組字元安全)

CASE WHEN DATALENGTH(col) > 40  -- 20 個中文字 = 40 bytes
     THEN SUBSTRING(col, 1, 20) + '...'  -- 此處仍以字元數計,若需精確位元組需 CLR 函數
     ELSE col END

3. 封裝為標量函數 (可重用)

CREATE FUNCTION dbo.fn_TruncateWithEllipsis
(
  @input NVARCHAR(MAX),
  @maxLen INT = 50,
  @ellipsis NVARCHAR(10) = N'...'
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
  IF @input IS NULL RETURN NULL;
  IF LEN(@input) <= @maxLen RETURN @input;
  RETURN LEFT(@input, @maxLen) + @ellipsis;
END;
GO

-- 使用
SELECT dbo.fn_TruncateWithEllipsis(ArticleTitle, 11, N'...') AS ShortTitle FROM Article;

效能提示

  • 此邏輯屬**標量運算**,隨查詢列數線性增長,百萬列查詢影響微乎其微。
  • 若頻繁用於 WHERE / ORDER BY,考慮建立計算欄位 + 索引 (Persisted Computed Column)。
  • 前端 (應用層/JS) 截斷通常更彈性 (支援 CSS text-overflow: ellipsis),建議**資料層回傳完整資料,前端負責顯示截斷**。

適用版本

SQL Server 2000 及以上版本皆支援 CASE、SUBSTRING、LEN、LEFT。

掌握這個通用模式,下次需求「標題超過 20 字顯示...」時,複製貼上修改數字即可,不再重造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved