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,' ')返回第一个中第二个参数第一次出现的位置索引,包括您正在搜索的字符串。即' '字符串中第一次出现的'hello my name is...' 加上空格。

substr(help, 1, instr(help,' ') - 1)然后将输入字符串从第一个字符带到 中指示的索引instr(...。然后我删除一个,以便不包括空间..


对于第 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 回答
0

如果你使用 MySQL 并且不能使用接受四个参数的 instr 函数或 regexp_substr,你可以这样做:

select substring_index(substring_index(help, ' ', 2), ' ', -1)
from (select 'hello my name is...' as help) h

结果:“我的”。

将上面代码中的“2”替换为您想要的单词的编号。

于 2016-06-16T09:12:16.770 回答
0

如果您使用的是 SQL Server 2016+,那么您可以利用 STRING_SPLIT 函数。它返回字符串值的行,如果您的目标是获取第 n 个值,那么您可以使用 Row_Number() 窗口函数。

这里有一个小技巧,因为您不想真正按某些东西排序,因此您必须“欺骗” row_number 函数并允许其值按自然顺序排列,即 STRING_SPLIT() 函数将吐出。

如果您想找到字符串的第三个单词,下面是一个代码片段

Declare @_intPart INT = 3; -- change nth work here, start # from 1 not 0 
SELECT value FROM(
    SELECT  value, 
    ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS rowno
    FROM STRING_SPLIT('hello world this is amazing', ' ')
) AS o1 WHERE o1.rowno = @_intPart;

您还可以创建一个标量函数来检索值。

于 2018-03-25T07:01:05.150 回答