我的数据库中有一个字段,为了报告的目的,我打算使用下面的语句截断50个字符。
SELECT (CASE WHEN (LEN(Notes) > 50) THEN SUBSTRING(Notes, 0, 50) + '...' WHEN (LEN(Notes) < 50) THEN SUBSTRING(Notes, 0, LEN(Notes)) + '...' ELSE 'NO NOTES WERE ENTERED' END) AS Notes FROM MyTable
这很好用,但是,我想完成备注字段中的最后一个单词,这样就不会切断单词,所以我想使用CHARINDEX,SUBSTRING,REVERSE和可能的RIGHT函数返回最后一个完整的单词,大约50个字符长的字符串的一部分。
我已经做过实验,但我运气不好。
任何帮助都将不胜感激。
答案 0 :(得分:3)
如果备注栏的长度超过50,您可以使用CHARINDEX
查找位置50后的下一个空格和SUBSTRING
到该位置。这是SQL Fiddle。
SELECT RTRIM(
CASE
-- when the length is less than 50, or the character at position 50 is part of the last word, return the entire string
WHEN LEN(notes) < 50 OR (SUBSTRING(notes,50,1) <> ' ' AND CHARINDEX(' ',notes,50) = 0)
THEN notes
-- when the character at position 50 is a space, return the first 50 characters of the string
WHEN SUBSTRING(notes,50,1) = ' '
THEN LEFT(notes, 50)
-- when the character at position 50 is a word, cut off the string at the next space after 50
WHEN SUBSTRING(notes,50,1) <> ' '
THEN LEFT(notes,CHARINDEX(' ',notes,50))
END) AS first_50
FROM tbl_notes
答案 1 :(得分:0)
如果您不想超出字符数限制,可以这样:
DECLARE @Table TABLE
(
String nvarchar(100)
)
DECLARE
@Size int = 25
INSERT @Table SELECT 'Lorem ipsum dolor sit ame'
INSERT @Table SELECT 'Lorem ipsum dolor sit ame tas'
INSERT @Table SELECT 'Lorem ipsum dolor sit am asd'
INSERT @Table SELECT 'Lorem ipsum dolor sita am'
INSERT @Table SELECT 'Lorem ipsum dolor sita a amet, consectetur adipiscing elit,'
INSERT @Table SELECT 'Lorem ipsum dolor sita'
INSERT @Table SELECT 'Lorem ipsum dolor sita asamet, consectetur adipiscing elit,'
SELECT
LEN(R.LimitTruncation) AS LimitTruncationLen,
R.LimitTruncation,
LEN(String) AS StringLen,
R.String
FROM
(
SELECT
String,
--This is the main part
CASE
WHEN LEN(String) <= @Size THEN String
WHEN CHARINDEX(' ', String, @Size) = @Size OR CHARINDEX(' ', String, @Size) = @Size + 1 THEN RTRIM(LEFT(String, @Size))
ELSE REVERSE(SUBSTRING(REVERSE(LEFT(String, @Size)), CHARINDEX(' ', REVERSE(LEFT(String, @Size))), @Size))
END AS LimitTruncation
FROM
@Table
) R