1

スペース区切り文字を含む文または一連の文字列の n 番目の単語を取得するにはどうすればよいですか?

要件の変更をお詫び申し上げます。ありがとうございます。

4

6 に答える 6

7

を使用して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 )
于 2012-04-11T15:46:14.057 に答える
5

これを試して。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 番目のアイテムを取得しています。

于 2012-04-11T16:34:26.803 に答える
1

次のようなものを試してください

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;

共有してお楽しみください。

于 2012-04-11T15:53:02.967 に答える
0

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

終わり

于 2013-12-27T10:11:45.337 に答える