報表、清單頁常需將長標題、內容截斷顯示,超過長度以「...」取代。本文提供通用的 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 | 條件邏輯,回傳截斷或原值 | 可巢狀、多條件 |
CASE WHEN LEN(col) > 20 THEN LEFT(col, 20) + '...' ELSE col END
CASE WHEN DATALENGTH(col) > 40 -- 20 個中文字 = 40 bytes
THEN SUBSTRING(col, 1, 20) + '...' -- 此處仍以字元數計,若需精確位元組需 CLR 函數
ELSE col END
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)。text-overflow: ellipsis),建議**資料層回傳完整資料,前端負責顯示截斷**。SQL Server 2000 及以上版本皆支援 CASE、SUBSTRING、LEN、LEFT。
掌握這個通用模式,下次需求「標題超過 20 字顯示...」時,複製貼上修改數字即可,不再重造輪子。