Sql server 如何从破折号分隔的字符串中返回以完整单词结尾的前N个字符?

Sql server 如何从破折号分隔的字符串中返回以完整单词结尾的前N个字符?,sql-server,tsql,Sql Server,Tsql,我需要一个函数,该函数首先输出以破折号分隔的输入字符串中的字符数 要求: >P,如果n在一个词的中间下降,包括输出中的最后一个词,即使总数大于n 如果输出以“-”结尾,LEN(输出)==N,则包括下一个字 示例:(N=70) 我已经使用了前70个字符,结果如下(我删除了结尾破折号-在这里不包括的单独步骤中): 在这种情况下,我需要一个返回以下内容的函数: this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-total

我需要一个函数,该函数首先输出以破折号分隔的输入字符串中的字符数

要求

>P,如果n在一个词的中间下降,包括输出中的最后一个词,即使总数大于n

  • 如果输出以“-”结尾,LEN(输出)==N,则包括下一个字

  • 示例:(N=70)

    我已经使用了前70个字符,结果如下(我删除了结尾破折号-在这里不包括的单独步骤中):

    在这种情况下,我需要一个返回以下内容的函数:

    this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength
    

    任何解决方案都将不胜感激。

    更新答案:修复了您的表达方式

    这将起作用,并基于@Lukstroms发布的内容;his不能处理您的第二个要求(当@N是连字符的位置时)

    先前的答案:

    prepared-for-better-Google-Search-Engnine-SEO-totalLength
    
    下面是如何使用this处理@N表示单词中间或破折号的情况

    DECLARE 
      @Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
      @N    INT           = 70;
    
    SELECT SUBSTRING(@Text,0,MAX(ng.nxt))
    FROM 
    (
      SELECT ng.position, nxt = LEAD(ng.Position,1) OVER (ORDER BY ng.Position), ng.Token
      FROM   samd.ngrams8k(@Text,1) AS ng
      WHERE  ng.Token = '-'  
    ) AS ng
    WHERE ng.Position <= @N;
    
    返回:

    prepared-for-better-Google-Search-Engnine-SEO-totalLength
    

    更新答案:修复了你的表情

    这将起作用,并基于@Lukstroms发布的内容;his不能处理您的第二个要求(当@N是连字符的位置时)

    先前的答案:

    prepared-for-better-Google-Search-Engnine-SEO-totalLength
    
    下面是如何使用this处理@N表示单词中间或破折号的情况

    DECLARE 
      @Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
      @N    INT           = 70;
    
    SELECT SUBSTRING(@Text,0,MAX(ng.nxt))
    FROM 
    (
      SELECT ng.position, nxt = LEAD(ng.Position,1) OVER (ORDER BY ng.Position), ng.Token
      FROM   samd.ngrams8k(@Text,1) AS ng
      WHERE  ng.Token = '-'  
    ) AS ng
    WHERE ng.Position <= @N;
    
    返回:

    prepared-for-better-Google-Search-Engnine-SEO-totalLength
    
    谢谢@LukStorms

    我通过以下声明实现了这一点:

    LEFT(@Text,CHARINDEX('-',@Text+'-',70)-1)
    
    谢谢@LukStorms

    我通过以下声明实现了这一点:

    LEFT(@Text,CHARINDEX('-',@Text+'-',70)-1)
    

    那么你试过什么,为什么不奏效?“我需要”不是一个问题;提示:在字符串中添加
    -
    ,使其始终以可预测的方式结束,并且
    CHARINDEX
    有第三个参数。
    左(@Text,CHARINDEX('-',@Text+'-',70)-1)
    那么您尝试了什么,为什么不起作用?“我需要”不是一个问题;你在问什么?提示:在字符串中添加
    -
    ,这样它的结尾总是可以预测的,并且
    CHARINDEX
    有第三个参数。
    左(@Text,CHARINDEX('-',@Text+'-',70)-1)
    与LukStorm在注释中的答案相比似乎过于复杂。与LukStorm在注释中的答案相比似乎过于复杂。