我们在MS SQL中有以下行:
Got event with: 123.123.123.123, event 34, brown fox
我们如何在一行SQL中提取第二个数字,即34个可靠数据?
答案 0 :(得分:1)
以下是使用SUBSTRING
和PATINDEX
执行此操作的一种方法 - 我使用CTE只是为了看起来不那么糟糕:)
WITH CTE AS (
SELECT
SUBSTRING(Data,CHARINDEX(',',Data)+1,LEN(Data)) data
FROM Test
)
SELECT LEFT(SUBSTRING(Data, PATINDEX('%[0-9]%', Data), 8000),
PATINDEX('%[^0-9]%',
SUBSTRING(Data, PATINDEX('%[0-9]%', Data), 8000) + 'X')-1)
FROM CTE
以下是一些示例Fiddle。
如评论所述,CTE仅适用于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
答案 1 :(得分:1)
只需将@s
替换为column name
即可将其应用于表格。假设该数字位于最后一个逗号和最后一个逗号之前的空格之间。 Sql-Fiddle-Demo
declare @s varchar(100) = '123.123.123.123, event 34, brown fox'
select right(first, charindex(' ', reverse(first),1) ) final
from (
select left(@s,len(@s) - charindex(',',reverse(@s),1)) first
--from tableName
) X
或 如果它位于第一个和第二个逗号之间,请尝试DEMO
select substring(first, charindex(' ',first,1),
charindex(',', first,1)-charindex(' ',first,1)) final
from (
select right(@s,len(@s) - charindex(',',@s,1)-1) first
) X
答案 2 :(得分:0)
我想到了另一种尚未被提及的方式。假设以下情况属实:
然后你可以使用内置的ParseName
函数来解析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', '')))
结果:
34
ParseName
解析点,但我们希望它用逗号解析。这是我所做的逻辑:
ParseName
以使用ParseName
并要求第二个“片段”。在你的例子中,这给了我们价值
“事件34”。我对性能与其他解决方案没有任何评论,它看起来同样混乱。不管怎样我以为我会把这个想法扔出去!