从列中的字符串中提取特定值

时间:2019-03-13 00:37:53

标签: sql sql-server

需要某种帮助,我需要从包含字符串的列中提取特定值。字符串因不同的记录而异,但是我需要提取的值始终以单词“ VERSION”

我尝试使用REVERSE&SUBSTRING,但无法获得准确的结果。任何帮助将不胜感激

桌子看起来像这样

Table Sample

这是我解决问题的尝试

SELECT DISTINCT A.USER_ID,USER_AGNT_STR,
  REVERSE(
        SUBSTRING(
            REVERSE(SUBSTRING(USER_AGNT_STR,20,PATINDEX('%VERSION%',USER_AGNT_STR))),
            4,
            PATINDEX('%.%',REVERSE(SUBSTRING(USER_AGNT_STR,5,PATINDEX('%VERSION%',USER_AGNT_STR)))))
    ) AS APP_VERSION
FROM TABLE A
WHERE USER_AGNT_STR LIKE '%VERSION%'
GROUP BY A.USER_ID,A.USER_AGNT_STR

我希望我的结果看起来像

USER ID       APP_VERSION
1             2.3.1
2             2.3
5             2.1
6             2.1
7             2.3.1
9             2.3
10            2.3

2 个答案:

答案 0 :(得分:2)

这是一种方法。

这假设version始终以空格开头,然后是空格,然后是版本号,然后是逗号。

以下表达式为您提供版本号的起始位置(9只是字符串version的长度加上周围的空格):

CHARINDEX(' version ', user_agnt_str) + 9

然后,您可以计算该位置之后的下一个逗号的位置,这表示版本号的结尾:

CHARINDEX(',', user_agnt_str, CHARINDEX(' version ', user_agnt_str) + 9)

两种信息现在都可以与SUBSTRING一起使用:

SUBSTRING(
    user_agnt_str, 
    CHARINDEX(' version ', user_agnt_str) + 9,
    CHARINDEX(',', user_agnt_str, CHARINDEX(' version ', user_agnt_str) + 9) 
        - CHARINDEX(' version ', user_agnt_str) - 9
)

Demo on DB Fiddle

WITH t AS (
  SELECT '{''HTTP_USER_AGENT'':''MOBILE/4.2.95, version 2.3.1, build 95 (iPhone 65;Apple ...)''}' user_agnt_str
)
SELECT 
    user_agnt_str,
    SUBSTRING(
        user_agnt_str, 
        CHARINDEX(' version ', user_agnt_str) + 9,
        CHARINDEX(',', user_agnt_str, CHARINDEX(' version ', user_agnt_str) + 9) 
            - CHARINDEX(' version ', user_agnt_str) - 9
    ) version
FROM t
GO
user_agnt_str                                                                    | version
:------------------------------------------------------------------------------- | :------
{'HTTP_USER_AGENT':'MOBILE/4.2.95 version 2.3.1 build 95 (iPhone 65;Apple ...)'} | 2.3.1  

答案 1 :(得分:0)

假设总有“版本”一词,然后实际版本号以逗号结尾:

  SELECT
    USER_ID,
    SUBSTRING(USER_AGNT_STR,PATINDEX('%VERSION%',USER_AGNT_STR)+7, (CHARINDEX(',',USER_AGNT_STR) - (PATINDEX('%VERSION%',USER_AGNT_STR)+7))) Version
  FROM
    [TABLE A]
    WHERE USER_AGNT_STR LIKE '%VERSION%'

这只是寻找单词“ Version”,然后在遇到逗号时停止。

相关问题