如何在空格分隔符的句子或一组字符串中获取第n个单词?
对不起要求的变更。谢谢。
答案 0 :(得分: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)
是来自第一个字符的{em>第n 次出现' '
。然后,您需要找到下一个索引instr(help,' ',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 处分解。你可以看到这很荒谬,所以你可能想考虑使用regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )
答案 1 :(得分:5)
试试这个。获得第四个单词的一个例子:
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个项目。
答案 2 :(得分: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;
分享并享受。
答案 3 :(得分:0)
CREATE PROC spGetCharactersInAStrings ( @S VARCHAR(100)='^ 1402 WSN NI ^ AMLAB ^ tev ^ e ^^ rtS htimS 0055518', @Char VARCHAR(100)='8' ) 如 - exec spGetCharactersInAStrings' ^ 1402 WSN NI ^ AMLAB ^ tev ^ e ^^ rtS htimS 0055518','5' 开始 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
END
答案 4 :(得分:0)
如果你正在使用MySQL并且不能使用接受四个参数的instr函数或regexp_substr,你可以这样做:
select substring_index(substring_index(help, ' ', 2), ' ', -1)
from (select 'hello my name is...' as help) h
结果:&#34;我的&#34;。
替换&#34; 2&#34;在上面的代码中包含您想要的单词的数量。
答案 5 :(得分:0)
如果您使用的是SQL Server 2016+,则可以利用STRING_SPLIT功能。它返回字符串值的行,如果你想获得第n个值,那么你可以使用Row_Number()窗口函数。
这里有一个小技巧,因为你不想真正按某种方式订购,这样你就不得不欺骗&#34; 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;
您还可以使用标量函数来检索值。