TSQL如何从字符串中获取第二个数字
我们在MS SQL中有以下行: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)+
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', '')))