簡體   English   中英

如何在SQL Server和Oracle SQL中基於固定字符選擇直到第N個空格的子字符串

[英]How to select a substring till Nth space based on fixed character in SQL Server and Oracle SQL

我需要根據固定的字符長度選擇一個子字符串,直到第N個空格。 讓我解釋一下這個問題。

我們假設我有三個不同的字符串:

  1. Lorem ipsum dolor坐下來,精致的adipistur elit
  2. Lorem ipsumdolor坐在amet,consectetur adipiscing elit
  3. Lorem ipsum dolorsitamet,consectetur adipiscing elit

如果我從字符串的開頭選擇20個字符,我會順序得到以下子字符串

  1. Lorem ipsum dolor si
  2. Lorem ipsumdolor坐
  3. Lorem ipsum dolorsit

但是我想要我的子串(最多20個字符)

  1. Lorem ipsum dolor
  2. Lorem ipsumdolor坐
  3. Lorem ipsum

也就是說,我不希望兩個空格之間有任何部分詞

請幫我生成查詢。

甲骨文:

select substr(substr(MyField,1,20), 1, instr(substr(MyField,1,20), ' ',-1,1))
from MyTable

SQL Server

SELECT LEFT(MyField, 20 - CHARINDEX (' ' ,REVERSE(LEFT(MyField,20))))
FROM MyTable

對於Oracle(應該可以將其轉換為SQL Server,但我不知道SQL Server:

  • 如果第一個“標記”(在第一個空格之前)超過20個字符,那么這將返回NULL
  • 如果第21個字符是空格,則返回前20個字符
  • 如果第21個字符不是空格,但前20個字符中有空格,則刪除前20個字符,然后找到“最后”空格並刪除它后面的所有內容。
  • 如果整個字符串最多為20個字符,則應按原樣返回。

在下面的測試數據中,我添加了另外兩個示例來測試它是否正常工作。

with
     inputs ( str ) as (
       select 'Lorem ipsum dolor sit amet, consectetur adipiscing elit' from dual union all
       select 'Lorem ipsumdolor sit amet, consectetur adipiscing elit'  from dual union all
       select 'Loremipsumdolorsitametconsedtetur'                       from dual union all
       select 'Lorem ipsumdolorsit amet, consectetur etc.'              from dual union all
       select 'Lorem ipsum dolorsitamet, consectetur adipiscing elit'   from dual union all
       select 'abcdef ghijk lmno'                                       from dual
     ),
     prep ( str, flag, fragment ) as (
       select str, 
              case when length(str) <= 20 or substr(str, 21, 1) = ' ' then 1 end, 
              substr(str, 1, 20)
       from   inputs
     )
select str, 
       case flag when 1 then fragment 
                        else substr(fragment, 1, instr(fragment, ' ', -1) - 1) end
       as new_str
from   prep;

STR                                                     NEW_STR            
------------------------------------------------------- --------------------
Lorem ipsum dolor sit amet, consectetur adipiscing elit Lorem ipsum dolor   
Lorem ipsumdolor sit amet, consectetur adipiscing elit  Lorem ipsumdolor sit
Loremipsumdolorsitametconsedtetur                                           
Lorem ipsumdolorsit amet, consectetur etc.              Lorem ipsumdolorsit 
Lorem ipsum dolorsitamet, consectetur adipiscing elit   Lorem ipsum
abcdef ghijk lmno                                       abcdef ghijk lmno 

如果是SQL Server,如果你不介意UDF。

Declare @YourTable table (SomeText varchar(500))
Insert Into @YourTable values
('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'),
('Lorem ipsumdolor sit amet, consectetur adipiscing elit'),
('Lorem ipsum dolorsitamet, consectetur adipiscing elit')

Declare @MaxLen int = 20
Select *,Trimmed = [dbo].[udf-Str-TrimToWord](SomeText,@MaxLen)
 From  @YourTable

返回

SomeText                                                    Trimmed
Lorem ipsum dolor sit amet, consectetur adipiscing elit.    Lorem ipsum dolor
Lorem ipsumdolor sit amet, consectetur adipiscing elit      Lorem ipsumdolor
Lorem ipsum dolorsitamet, consectetur adipiscing elit       Lorem ipsum

UDF

CREATE FUNCTION [dbo].[udf-Str-TrimToWord] (@String varchar(max),@MaxLen int)
Returns varchar(max)
AS
Begin
    Return LEFT(@String,@MaxLen-CharIndex(' ' ,Reverse(Left(@String,@MaxLen))))
End

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM