【问题标题】:Extract a specific value from a string in a column从列中的字符串中提取特定值
【发布时间】:2019-03-13 00:37:53
【问题描述】:

在某种情况下需要帮助,我需要从包含字符串的列中提取特定值。字符串因不同的记录而异,但我需要提取的值总是以单词“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

【问题讨论】:

  • 你想要什么结果?
  • 如果您以他们可以剪切和粘贴的方式发布数据以供测试,那么人们可以更轻松地为您提供帮助。事实上,如果您可以使用临时表设置数据,那么您将获得更多帮助。

标签: sql sql-server string tsql select


【解决方案1】:

这是一种方法。

这假定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 |版本 :------------------------------------------------ ------------------------------ | :------ {'HTTP_USER_AGENT':'MOBILE/4.2.95 版本 2.3.1 build 95 (iPhone 65;Apple ...)'} | 2.3.1

【讨论】:

  • 你好@GMB:非常感谢,这对我帮助很大,节省了大量时间
  • 欢迎@GMohan!很高兴知道它有帮助。
【解决方案2】:

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

  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”,然后在遇到逗号时停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多