Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用空格分隔符获取任何通用单词或句子中的第n个字符串_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 如何使用空格分隔符获取任何通用单词或句子中的第n个字符串

Sql 如何使用空格分隔符获取任何通用单词或句子中的第n个字符串,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,如何使用空格分隔符获取句子或一组字符串中的第n个单词 很抱歉更改了要求。谢谢。使用 instrhelp“”返回第一个参数中第二个参数第一次出现的位置索引,包括正在搜索的字符串。i、 e.字符串“hello my name is…”中第一个出现的“”加上空格 然后,substrhelp,1,instrhelp,'-1将输入字符串从第一个字符带到instr中指示的索引。。。。然后我删除了一个,这样就不包括空间 对于第n次出现,只需稍微更改一下: instrhelp',1,n是“”从第一个字符开始的第

如何使用空格分隔符获取句子或一组字符串中的第n个单词

很抱歉更改了要求。谢谢。

使用

instrhelp“”返回第一个参数中第二个参数第一次出现的位置索引,包括正在搜索的字符串。i、 e.字符串“hello my name is…”中第一个出现的“”加上空格

然后,substrhelp,1,instrhelp,'-1将输入字符串从第一个字符带到instr中指示的索引。。。。然后我删除了一个,这样就不包括空间

对于第n次出现,只需稍微更改一下:

instrhelp',1,n是“”从第一个字符开始的第n次出现。然后你需要在instrhelp中找到下一个索引的位置索引,,,1,n+1,最后计算出它们之间的差异,这样你就知道在你的substr中要走多远了。。。。当你在寻找第n个时,当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。正如你所看到的,这是荒谬的,所以你可能想考虑使用< /P> 通过使用

instrhelp“”返回第一个参数中第二个参数第一次出现的位置索引,包括正在搜索的字符串。i、 e.字符串“hello my name is…”中第一个出现的“”加上空格

然后,substrhelp,1,instrhelp,'-1将输入字符串从第一个字符带到instr中指示的索引。。。。然后我删除了一个,这样就不包括空间

对于第n次出现,只需稍微更改一下:

instrhelp',1,n是“”从第一个字符开始的第n次出现。然后你需要在instrhelp中找到下一个索引的位置索引,,,1,n+1,最后计算出它们之间的差异,这样你就知道在你的substr中要走多远了。。。。当你在寻找第n个时,当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。正如你所看到的,这是荒谬的,所以你可能想考虑使用< /P> 试试像这样的东西

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;
分享和享受。

试试类似的东西

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;

分享和享受。

试试这个。获取第四个单词的示例:

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项。

尝试此操作。获取第四个单词的示例:

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项。

创建过程spGetCharactersInAStrings @S VARCHAR100=“^1402 WSN NI^AMLAB^tev^e^rtS htimS 0055518”, @Char VARCHAR100='8' 像 -执行SPGetCharactersAstrings“^1402 WSN NI^AMLAB^tev^e^^rtS htimS 0055518”、“5” 开始 声明@i INT=1, @c INT, @位置INT=0, @NewStr VARCHAR100, @sql NVARCHAR100, @ParmDefinition nvarchar500=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

结束创建过程spGetCharactersInAStrings @S VARCHAR100=“^1402 WSN NI^AMLAB^tev^e^rtS htimS 0055518”, @Char VARCHAR100='8' 像 -执行SPGetCharactersAstrings“^1402 WSN NI^AMLAB^tev^e^^rtS htimS 0055518”、“5” 开始 声明@i INT=1, @c INT, @位置INT=0, @NewStr VARCHAR100, @sql NVARCHAR100, @ParmDefinition nvarchar500=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

END

如果您使用的是MySQL,并且无法使用接受四个参数或regexp_substr的instr函数,则可以这样做:

select substring_index(substring_index(help, ' ', 2), ' ', -1)
from (select 'hello my name is...' as help) h
结果:我的


将上面代码中的2替换为所需的字数。

如果您使用的是MySQL,并且无法使用接受四个参数或regexp_substr的instr函数,则可以通过以下方式执行:

select substring_index(substring_index(help, ' ', 2), ' ', -1)
from (select 'hello my name is...' as help) h
结果:我的


将上述代码中的2替换为所需的字号。

如果您使用的是SQL Server 2016+,则可以利用字符串分割功能。它返回一行行字符串值,如果您希望获得第n个值,则可以使用Row_Number窗口函数

这里有一个小技巧,因为你不想真正按某个东西排序,所以你必须欺骗row\u number函数,并允许它的值按自然顺序排列,这就是STRING\u 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;

还可以使用标量函数来检索值

如果您使用的是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;

还可以使用标量函数来检索值

至少告诉我如何使用空格分隔符计算字符串中的字数。@Vutukuri,这不公平,你改变了问题。你不能指望答案会自动更新。我在我的更新中提供了很多信息,这些信息应该可以帮助你找到计数——尽管它也回答了这个问题。最后一个链接可能是最好的,请参阅:regexp_count.+1您已经获得了它,并且您的正则表达式解决方案比我的要好一点。至少告诉我如何使用空格分隔符获得字符串中的字数。@Vutukuri,这不公平,您更改了问题。你不能指望答案会自动更新。我在我的更新中提供了很多信息,这些信息应该可以帮助你找到计数——尽管它也回答了这个问题。最后一个链接可能是最好的,请参阅:regexp_count.+1您已经获得了它,并且您的正则表达式解决方案比我的要好一点。请重新编写答案以匹配修改后的问题。更改factoring子句中的匹配项,以匹配您尝试查找的子字符串/单词。答案类似于@Ben,但我更喜欢大小写。YMMV.改写答案以匹配修改后的问题。更改factoring子句中的匹配项,以匹配您尝试查找的子字符串/单词。答案类似于@Ben,但我更喜欢大小写。YMMV。