Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL如何从字符串中获取第二个数字_Sql_Sql Server - Fatal编程技术网

TSQL如何从字符串中获取第二个数字

TSQL如何从字符串中获取第二个数字,sql,sql-server,Sql,Sql Server,我们在MS SQL中有以下行: get事件:123.123.123.123,事件34,布朗福克斯 我们如何在一行SQL中提取第二个数字,即34 reliable?这里有一种方法,使用子字符串和PATINDEX——我使用了CTE,这样看起来就不会那么糟糕:) 这是一些样品 如评论所述,CTEs仅适用于2005年及更高版本。如果碰巧您使用的是2000,那么这将在没有CTE的情况下工作: SELECT LEFT(SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+

我们在MS SQL中有以下行:

get事件:123.123.123.123,事件34,布朗福克斯


我们如何在一行SQL中提取第二个数字,即34 reliable?

这里有一种方法,使用
子字符串和
PATINDEX
——我使用了CTE,这样看起来就不会那么糟糕:)

这是一些样品

如评论所述,CTEs仅适用于2005年及更高版本。如果碰巧您使用的是2000,那么这将在没有CTE的情况下工作:

SELECT LEFT(SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000), 
         PATINDEX('%[^0-9]%', 
         SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000) + 'X')-1)
FROM Test

这里有一种使用
SUBSTRING
PATINDEX
的方法——我使用了一个CTE,这样看起来就不会那么糟糕了:)

这是一些样品

如评论所述,CTEs仅适用于2005年及更高版本。如果碰巧您使用的是2000,那么这将在没有CTE的情况下工作:

SELECT LEFT(SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000), 
         PATINDEX('%[^0-9]%', 
         SUBSTRING(SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)), 
         PATINDEX('%[0-9]%', SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data))), 8000) + 'X')-1)
FROM Test

只需将
@s
替换为
列名
,即可将其应用于表。假设该数字介于最后一个逗号和最后一个逗号之前的空格之间

如果介于第一个和第二个逗号之间,请尝试


只需将
@s
替换为
列名
,即可将其应用于表。假设该数字介于最后一个逗号和最后一个逗号之前的空格之间

如果介于第一个和第二个逗号之间,请尝试


我想到了另一种尚未提及的方式。假设以下情况属实:

  • 第二个“部分”前始终有一个逗号
  • 总是“事件”这个词,数字在第二部分
  • 您正在使用SQL Server 2005+
然后可以使用用于解析SysName数据类型的内置函数

--Variable to hold your example
DECLARE @test NVARCHAR(50)
SET @test = 'Got event with: 123.123.123.123, event 34, brown fox'

SELECT Ltrim(Rtrim(Replace(Parsename(Replace(Replace(@test, '.', ''), ',', '.'), 2), 'event', '')))
结果:

三十四

ParseName
围绕点进行解析,但我们希望它围绕逗号进行解析。以下是我所做工作的逻辑:

  • 删除字符串中的所有现有点,在本例中,使用空字符串替换它们
  • 将所有逗号替换为点,以便
    ParseName
    使用
  • 使用
    ParseName
    并请求第二个“工件”。在您的示例中,这为我们提供了值 “事件34”
  • 从字符串中删除单词“event”
  • 修剪两端并返回值

  • 与其他解决方案相比,我对性能没有任何评论,它看起来也同样混乱。我还以为我会把这个想法扔出去呢

    我想到了另一种尚未提及的方式。假设以下情况属实:

    • 第二个“部分”前始终有一个逗号
    • 总是“事件”这个词,数字在第二部分
    • 您正在使用SQL Server 2005+
    然后可以使用用于解析SysName数据类型的内置函数

    --Variable to hold your example
    DECLARE @test NVARCHAR(50)
    SET @test = 'Got event with: 123.123.123.123, event 34, brown fox'
    
    SELECT Ltrim(Rtrim(Replace(Parsename(Replace(Replace(@test, '.', ''), ',', '.'), 2), 'event', '')))
    
    结果:

    三十四

    ParseName
    围绕点进行解析,但我们希望它围绕逗号进行解析。以下是我所做工作的逻辑:

  • 删除字符串中的所有现有点,在本例中,使用空字符串替换它们
  • 将所有逗号替换为点,以便
    ParseName
    使用
  • 使用
    ParseName
    并请求第二个“工件”。在您的示例中,这为我们提供了值 “事件34”
  • 从字符串中删除单词“event”
  • 修剪两端并返回值

  • 与其他解决方案相比,我对性能没有任何评论,它看起来也同样混乱。我还以为我会把这个想法扔出去呢

    我被你的问题弄糊涂了。上面的数据是单个字符串,您想提取34吗?它总是第一个逗号后的第一个数字吗?这个数字总是在字符串
    'event'
    之后吗?嗨,是的,上面是1个字符串,是的,34个数字总是在第一个逗号之后。我被你的问题弄糊涂了。上面的数据是单个字符串,您想提取34吗?它是否总是第一个逗号后的第一个数字?该数字是否总是在字符串
    'event'
    之后?您好,是1字符串即上面的字符串,是34数字总是在第一个逗号+1之后,回答得很好,尽管使用CTE意味着这可以用于SQL Server 2005+(无论如何,情况应该是这样的,因为今年没有人应该使用SQL Server 2000)@Lamak--谢谢,你绝对正确。我将编辑答案以显示“更丑”的版本:)它必须基于某种假设。否则它将打破+1,回答很好,尽管使用CTE意味着这可以用于SQL Server 2005+(无论如何,情况应该是这样,因为今年没有人应该使用SQL Server 2000)@Lamak--谢谢,你完全正确。我将编辑答案以显示“更丑”的版本:)它必须基于某种假设。否则,假设在事件34之后没有数字或逗号,它将破坏好的答案,在这种情况下,这将不起作用()是的,基于这些假设!假设事件34后没有数字或逗号,答案很好,在这种情况下,这将不起作用()是的,根据假设!
    --Variable to hold your example
    DECLARE @test NVARCHAR(50)
    SET @test = 'Got event with: 123.123.123.123, event 34, brown fox'
    
    SELECT Ltrim(Rtrim(Replace(Parsename(Replace(Replace(@test, '.', ''), ',', '.'), 2), 'event', '')))