スペース区切り文字を含む文または一連の文字列の n 番目の単語を取得するにはどうすればよいですか?
要件の変更をお詫び申し上げます。ありがとうございます。
を使用してinstr
。
select substr(help, 1, instr(help,' ') - 1)
from ( select 'hello my name is...' as help
from dual )
instr(help,' ')
検索している文字列を含めて、最初の引数で 2 番目の引数が最初に出現する位置インデックスを返します。' '
つまり、文字列内で最初に出現する にスペース'hello my name is...'
を加えたものです。
substr(help, 1, instr(help,' ') - 1)
次に、入力文字列を最初の文字から で示されるインデックスまで取得しinstr(...
ます。次に、スペースが含まれないように1つ削除します..
n 番目のオカレンスについては、これをわずかに変更します。
instr(help,' ',1,n)
は最初の文字からn 番目に出現します。' '
次に、次のインデックスの位置インデックスを見つける必要がありますinstr(help,' ',1,n + 1)
。最後に、それらの違いを計算して、substr(...
. nthを探しているとき、nが 1 の場合、これは故障し、次のように対処する必要があります。
select substr( help
, decode( n
, 1, 1
, instr(help, ' ', 1, n - 1) + 1
)
, decode( &1
, 1, instr(help, ' ', 1, n ) - 1
, instr(help, ' ', 1, n) - instr(help, ' ', 1, n - 1) - 1
)
)
from ( select 'hello my name is...' as help
from dual )
これもnで壊れます。ご覧のとおり、これはばかげているので、使用を検討することをお勧めします。regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )
これを試して。4 番目の単語を取得する例:
select names from (
select
regexp_substr('I want my two dollars','[^ ]+', 1, level) as names,
rownum as nth
from dual
connect by regexp_substr('I want my two dollars', '[^ ]+', 1, level) is not null
)
where nth = 4;
内部クエリは、スペースで区切られた文字列を一連の行に変換しています。外側のクエリは、セットから n 番目のアイテムを取得しています。
次のようなものを試してください
WITH q AS (SELECT 'ABCD EFGH IJKL' AS A_STRING FROM DUAL)
SELECT SUBSTR(A_STRING, 1, INSTR(A_STRING, ' ')-1)
FROM q
共有してお楽しみください。
そして、修正された質問の解決策は次のとおりです。
WITH q AS (SELECT 'ABCD EFGH IJKL' AS A_STRING, 3 AS OCCURRENCE FROM DUAL)
SELECT SUBSTR(A_STRING,
CASE
WHEN OCCURRENCE=1 THEN 1
ELSE INSTR(A_STRING, ' ', 1, OCCURRENCE-1)+1
END,
CASE
WHEN INSTR(A_STRING, ' ', 1, OCCURRENCE) = 0 THEN LENGTH(A_STRING)
ELSE INSTR(A_STRING, ' ', 1, OCCURRENCE) - CASE
WHEN OCCURRENCE=1 THEN 0
ELSE INSTR(A_STRING, ' ', 1, OCCURRENCE-1)
END - 1
END)
FROM q;
共有してお楽しみください。
CREATE PROC spGetCharactersInAStrings ( @S VARCHAR(100) = '^1402 WSN NI^AMLAB^tev^e^^rtS htimS 0055518', @Char VARCHAR(100) = '8' ) AS -- exec spGetCharactersInAStrings '^1402 WSN NI ^AMLAB^tev^e^^rtS htimS 0055518', '5' BEGIN DECLARE @i INT = 1, @c INT, @pos INT = 0, @NewStr VARCHAR(100), @sql NVARCHAR(100), @ParmDefinition nvarchar(500) = N'@retvalOUT int OUTPUT'
DECLARE @D TABLE
(
ID INT IDENTITY(1, 1),
String VARCHAR(100),
Position INT
)
SELECT @c = LEN(@S), @NewStr = @S
WHILE @i <= @c
BEGIN
SET @sql = ''
SET @sql = ' SELECT @retvalOUT = CHARINDEX(''' + + @Char + ''',''' + @NewStr + ''')'
EXEC sp_executesql @sql, @ParmDefinition, @retvalOUT=@i OUTPUT;
IF @i > 0
BEGIN
set @pos = @pos + @i
SELECT @NewStr = SUBSTRING(@NewStr, @i + 1, LEN(@S))
--SELECT @NewStr '@NewStr', @Char '@Char', @pos '@pos', @sql '@sql'
--SELECT @NewStr '@NewStr', @pos '@pos'
INSERT INTO @D
SELECT @NewStr, @pos
SET @i = @i + 1
END
ELSE
BREAK
END
SELECT * FROM @D
終わり