SQL Server子字符串打破单词,而不是字符

时间:2009-04-06 17:29:43

标签: sql word substring break

我想在搜索结果中显示不超过n个字符的文本字段,以便让用户了解内容。但是,我找不到一种容易打破单词的方法,所以我在休息时用一个部分词来结束。

当我想表明:“这名学生尚未提交他的最后几个作业”时,系统可能会显示:“这名学生尚未提交他的最后几个作品”

我希望系统显示保留字词的n个字符限制,所以我想看看:

“这名学生尚未提交他的最后几个”

我是否可以在T-SQL中编写最接近的单词函数,或者在将结果返回到ASP或.NET时是否应该这样做?

7 个答案:

答案 0 :(得分:1)

我建议在数据库外部做这种逻辑。使用C#,它看起来可能类似于:

static string Cut(string s, int length)
{
    if (s.Length <= length)
    {
        return s;
    }

    while (s[length] != ' ')
    {
        length--;
    }

    return s.Substring(0, length).Trim();
}

原因你可以用T-SQL做到这一点,但这是个坏主意(性能不佳等)。如果你真的需要把它放在DB里,我会使用基于CLR的存储过程。

答案 1 :(得分:1)

如果必须在T-SQL中执行此操作:

DECLARE @t VARCHAR(100)
SET @t = 'This student has not submitted his last few assignments'

SELECT LEFT(LEFT(@t, 50), LEN(LEFT(@t, 50)) - CHARINDEX(' ', REVERSE(LEFT(@t, 50))))

它不会是灾难性的慢,但它肯定比在表示层中这样做慢。

除此之外 - 只是切断单词并为长字符串添加省略号也不是一个坏选择。这样,至少所有截断的字符串都具有相同的长度,如果您要格式化固定宽度的输出,这可能会派上用场。

答案 2 :(得分:1)

我同意在数据库之外执行此操作,因为具有不同长度限制的其他应用程序可以自行决定显示/隐藏的内容。也许这可以是数据库调用的参数。

这是一个快速解决方案:

DECLARE @OriginalData NVARCHAR(MAX)
    ,@ReversedData NVARCHAR(MAX)
    ,@MaxLength INT 
    ,@DelimiterPosition INT ;

SELECT @OriginalData = 'This student has not submitted his last few assignments'
    ,@MaxLength = 45;

SET @ReversedData = REVERSE(
                        LEFT(@OriginalData, @MaxLength)
                    );

SET @DelimiterPosition = CHARINDEX(' ', @ReversedData);

PRINT LEFT(@OriginalData, @MaxLength - @DelimiterPosition);

/*
This student has not submitted his last few assignments
1234567890123456789012345678901234567890123456789012345
*/

答案 3 :(得分:1)

我想补充已经提供的解决方案,断字逻辑比表面看起来复杂得多。为了做得好,你需要为构成单词的内容定义一些规则。请考虑以下事项:

  • Spaces - 没脑子。
  • 连字符 - 这取决于。在过度曝光中,在重新制作动画中可能不会。那么日期如 01-02-1985
  • 期间 - 没有脑子。哦等等, myemail@myisp.com $ 79.95 中的那个怎么样?
  • 逗号 - 数字如 1,239 no,但句子是肯定的。
  • 撇号 - 在 O'Reily 中, SQL是'企业'数据库工具是。
  • 单独使用特殊字符构成单词吗?:在第1项:购买TP 中,冒号算作单词?

答案 4 :(得分:0)

我在this site找到了答案并对其进行了修改:

  • 演员表(150)必须大于你要返回的字符数(100)

    LEFT(Cast(myTextField As varchar(150)), CHARINDEX('',CAST(flag_myTextField AS VARCHAR(150)),100))AS myTextField_short

答案 5 :(得分:0)

我不确定这会有多快,但它会起作用......

DECLARE @Max  int

SET @Max=??

SELECT
   REVERSE(RIGHT(REVERSE(LEFT(YourColumnHere,@Max)),@Max- CHARINDEX(' ',REVERSE(LEFT(YourColumnHere,@Max)))))
    FROM YourTable
    WHERE X=Y

答案 6 :(得分:-1)

我也不建议这样做,但如果必须,你可以这样做:

DECLARE @text nvarchar(max);
DECLARE @end_char int;
SELECT @text  = 'This student has not submitted his last few assignments', @end_char = 50 ;

WHILE @end_char > 0 AND SUBSTRING( @text, @end_char+1, 1 ) <> ' '
    SET @end_char = @end_char - 1

SELECT @text = SUBSTRING( @text, 1, @end_char ) ;

SELECT @text