[英]Extracting Specific words from a dynamic string source
您好,尽管我多年来一直在使用此网站来搜索答案,但我对堆栈溢出并不陌生。 所以我有一个问题,要从很长的字符串中提取各种特定细节。 问题是,字符串不是静态的并且没有固定的索引,所以我不能使用子字符串函数。 字符串输出的示例如下所示。
Sample 1:
1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400
Sample 2:
1 AJ 2552 O 10/8/2016 0:0:0 6 PSI KTL 0 GK 2 10/28/2016 7:0:0 9/28/2016 8:5:0 O20YEARS 32.2400
如您所见,字符串的索引已相应调整,因此我不能依赖固定的子字符串函数。
我对SQL还是很陌生,希望您就如何处理此问题提供建议。
到目前为止,我尝试的方法只是子字符串。
更新:
抱歉,我忘了提到我不是在提取基于任何字符或字符串的数据库。 我正在从该字符串中提取确切的部分。 例如,
Sample 1:
1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400
我需要提取“ 2016年9月28日”的“首次约会”和“ PSI KTL”
因此,从技术上讲,我需要从字符串中提取第n个单词。
现在,我正在尝试使用空格作为定界符,并将每个单词分配到临时表中,但目前看来它无法正常工作。
谢谢!
尝试这个:
CREATE FUNCTION GetWordBasedOnIndex(@text varchar(max),@index int)
RETURNS varchar(50)
AS
BEGIN
DECLARE @RET VARCHAR(50),@counter int
SET @text = LTRIM(RTRIM(@text))
SET @counter = 1
IF @counter < @index
BEGIN
SET @text = LTRIM(RTRIM(SUBSTRING(@text, CHARINDEX(' ',@text,1), LEN(@text) - CHARINDEX(' ',@text,1)+1)))
SET @text = dbo.GetWordBasedOnIndex(@text,@index-1)
END
IF CHARINDEX(' ',@text,1)=0 SET @RET = @text
ELSE SET @RET = SUBSTRING(@text,@counter,CHARINDEX(' ',@text,1))
RETURN @RET
END
declare @string nvarchar(max)
set @string = '1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400';
SELECT DBO.GetWordBasedOnIndex(@string, 5)
如果从表传递并根据索引取词:
declare @string nvarchar(max)
set @string = '1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400';
SELECT [dbo].[GetWordBasedOnIndex](@string, 5)
CREATE table #temp (msg nvarchar(max))
INSERT INTO #temp VALUES(@string)
SELECT [dbo].[GetWordBasedOnIndex](msg, 5) as test from #temp
drop table #temp
请尝试以下操作:
DECLARE @s varchar(8000)
DECLARE @s2 varchar(8000)
set @s = '1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400';
SET @s2 =SUBSTRING(@s, CHARINDEX('PSI KTL', @s), 8000)
select SUBSTRing(@s2, PATINDEX('%__/__/____%', @s2), 10)
更新:
如果要使用空格作为分隔符来解析字符串,则可以将SQL 2016的String_Split或其他类似的UDF函数用于其他版本:
DECLARE @s varchar(max)
set @s = '1 AJ 2552 O 10/8/2016 0:0:0 6 PSI KTL 0 GK 2 10/28/2016 7:0:0 9/28/2016 8:5:0 O20YEARS 32.2400';
SET @s = replace(@s, ' ', ' '); -- Here, you can replace other white spaces by single space.
WITH cte
AS (
SELECT *,
ROW_NUMBER() Over(ORDER BY (SELECT null)) as RN
from string_split(@s, ' ')
)
SELECT * FROM cte
WHERE RN = 15
如果使用SQL Server 2016 ,则另一个简单的解决方案
1)使用STRING_SPLIT
函数,该函数使用指定的分隔符分隔字符表达式。
3)通过使用ISDATE
函数检测日期值
2)最后,使用Top 1
检索第一行。
如下:
SELECT TOP 1 *
FROM STRING_SPLIT ('1 AJ 552 O 9/28/2016 0:0:0 6 PSI KTL 0 GK 2 9/28/2016 7:20:0 9/28/2016 8:35:0 O20YEARS 32.2400
', ' ')
WHERE ISDATE(value) = 1
结果:
value
9/28/2016
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.