將數據分為「超長需截斷」和「正常長度」兩組,分別處理後 UNION ALL 合並。
DECLARE @MaxLen INT = 25;
SELECT
ID,
CASE
WHEN DATALENGTH(Description) > @MaxLen
THEN LEFT(Description, @MaxLen) + '...'
ELSE Description
END AS ShortDesc,
Kind, DateTime, Author, Hit
FROM [xjx]
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC;
優勢:單查詢、無 UNION、利用 CASE 表達式、DATALENGTH 計算字節長度 (中文 2 字節)。
-- Access 使用 LEN() 計算字符數 (中文算 1)
-- MySQL 使用 CHAR_LENGTH() 或 LENGTH()
SELECT ID,
LEFT(Description, 25) + '...' AS ShortDesc,
Kind, DateTime, Author, Hit
FROM [xjx]
WHERE LEN(Description) > 25 AND Kind = '活動簡報'
UNION ALL
SELECT ID,
Description AS ShortDesc,
Kind, DateTime, Author, Hit
FROM [xjx]
WHERE LEN(Description) <= 25 AND Kind = '活動簡報'
ORDER BY DateTime DESC;
SELECT
ID,
IF(CHAR_LENGTH(Description) > 25, CONCAT(LEFT(Description, 25), '...'), Description) AS ShortDesc,
Kind, DateTime, Author, Hit
FROM xjx
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC
LIMIT 5;
SELECT ID,
IIF(LEN(Description) > 25, LEFT(Description, 25) & "...", Description) AS ShortDesc,
Kind, DateTime, Author, Hit
FROM xjx
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC;
| 函數 | SQL Server | MySQL | Access | 說明 |
|---|---|---|---|---|
| DATALENGTH | ✓ | ✗ | ✗ | 字節長度,中文 2 字節 |
| LEN | ✓ (忽略尾部空格) | ✓ (字符數) | ✓ (字符數) | 字符長度 |
| LENGTH | ✗ | ✓ (字節數) | ✗ | 字節長度 |
| CHAR_LENGTH | ✗ | ✓ (字符數) | ✗ | 字符長度,多字節安全 |
// PHP 示例
function truncate($str, $len = 25, $suffix = '...') {
if (mb_strlen($str, 'UTF-8') <= $len) return $str;
return mb_substr($str, 0, $len, 'UTF-8') . $suffix;
}
// 模板中直接使用
echo truncate($row['Description']);
mb_substr