在第n个字符之前返回第n个字符或最终空格之前的所有内容

时间:2017-06-21 23:53:29

标签: 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(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

我在下面的帖子中找到了。

Use SUBSTRING AND CHARINDEX to get last complete word in field

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

---编辑---------

举个例子:

  

这是一个e [x]充足的字符串

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

  

这是一个例子

我需要的是它返回:

  

这是

所以在第50个字符之前最后一次出现空格字符。

1 个答案:

答案 0 :(得分:3)

您需要先将字符串剪切为前50个字符,以确保它永远不会超出该字符串。然后使用LEFT功能应用CHARINDEX()REVERSE(),并按第一次出现的空格切换

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