簡體   English   中英

從動態字符串源中提取特定單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM