Sql server 返回第n个字符之前的所有内容或第n个字符之前的最后空格

Sql server 返回第n个字符之前的所有内容或第n个字符之前的最后空格,sql-server,tsql,Sql Server,Tsql,我使用以下代码,将所有内容修剪到最后一个单词,并在50个字符处留出一个空格: 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(CompanyName) < 50 OR (SUBSTRING(CompanyNa

我使用以下代码,将所有内容修剪到最后一个单词,并在50个字符处留出一个空格:

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(CompanyName) < 50 OR (SUBSTRING(CompanyName,50,1) <> ' ' AND CHARINDEX(' ',CompanyName,50) = 0)
            THEN CompanyName
        -- when the character at position 50 is a space, return the first 50 characters of the string
        WHEN SUBSTRING(CompanyName,50,1) = ' '
            THEN LEFT(CompanyName, 50)
        -- when the character at position 50 is a word, cut off the string at the next space after 50
        WHEN SUBSTRING(CompanyName,50,1) <> ' '
            THEN LEFT(CompanyName,CHARINDEX(' ',CompanyName,50) - 1)
    END) AS first_50
FROM Organisation
这是我在下面的线程中发现的

基本上,我需要最后一个块来获取最后一个空格之前而不是之后的所有内容,因此结果的长度永远不会超过50个字符

--编辑-----

例如:

这是一个e[x]示例字符串

如果示例中第50个字符落在x上,则上面的代码将给出:

这是一个例子

我需要的是它返回:

这是一个


因此,直到最后一次出现第50个字符之前的空格字符为止的所有内容。

您需要首先将字符串剪切到其前50个字符,以确保它永远不会超出此范围。然后使用反向函数应用左、右和CHARINDEX,并按空格的第一个匹配项进行剪切

 select LEFT(SUBSTRING(CompanyName, 1, 50), 
             50 - CHARINDEX(' ',REVERSE(SUBSTRING(CompanyName, 1, 50)))) 
 from Organization;

如果您只想将字符串剪切到第一个空格字符,如果在第50个字符之前没有空格,则将所有字符串剪切到第50个字符,这很简单,但我不确定您真正想要的是什么。请查看我的编辑,如果不清楚,很抱歉。基本上,数据库中的字段只能容纳50个字符,因此我需要对其进行修剪,但我不希望在字符串的末尾有半个字。您需要使用反向函数来获取第50个字符之前最后一个空格的位置。我更新了我的答案。过来看。