4

我想在搜索结果中显示不超过 n 个文本字段的字符,以便让用户了解内容。但是,我找不到轻松断词的方法,所以我在断词时用了一个部分词。

当我想显示:“这个学生还没有提交他的最后几个作业”时,系统可能会显示:“这个学生没有提交他的最后几个作业”

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

“这个学生还没有提交他的最后几个”

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

4

7 回答 7

2

如果您必须在 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))))

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

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

于 2009-04-06T17:43:35.237 回答
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
*/
于 2009-04-06T17:46:50.953 回答
1

我想补充一下已经提供的解决方案,断字逻辑比表面上看起来要复杂得多。要做到这一点,您将需要为单词的构成定义许多规则。考虑以下:

  • 空间 - 没有脑子。
  • 连字符 - 这取决于。在过度曝光中可能,在重新制作动画时可能不会。那么像01-02-1985这样的日期呢?
  • 时期 - 没有脑子。哦,等等,myemail@myisp.com$79.95中的那个呢?
  • 逗号 - 在数字中,例如1,239否,但在句子中是。
  • 撇号 - 在O'Reily中不,在SQL 中是“企业”数据库工具是的。
  • 特殊字符是否单独构成单词?:在第1项:购买TP中,冒号算作单词吗?
于 2009-04-06T17:56:10.277 回答
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 执行此操作,但这是个坏主意(性能不佳等)。如果你真的需要把它放在数据库中,我会使用基于 CLR 的存储过程。

于 2009-04-06T17:32:04.373 回答
0

我在此站点上找到了答案并对其进行了修改:

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

    LEFT (Cast(myTextField As varchar(150)), CHARINDEX(' ', CAST(fl​​ag_myTextField AS VARCHAR(150)), 100) ) 作为 myTextField_short

于 2009-04-06T17:42:26.550 回答
0

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

DECLARE @Max  int

SET @Max=??

SELECT
   REVERSE(RIGHT(REVERSE(LEFT(YourColumnHere,@Max)),@Max- CHARINDEX(' ',REVERSE(LEFT(YourColumnHere,@Max)))))
    FROM YourTable
    WHERE X=Y
于 2009-04-06T17:43:13.973 回答
-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
于 2009-04-06T17:48:03.230 回答