需要某种帮助,我需要从包含字符串的列中提取特定值。字符串因不同的记录而异,但是我需要提取的值始终以单词“ VERSION”
我尝试使用REVERSE&SUBSTRING,但无法获得准确的结果。任何帮助将不胜感激
桌子看起来像这样
这是我解决问题的尝试
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
答案 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
)
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”,然后在遇到逗号时停止。