我们在 MS SQL 中有以下行:
Got event with: 123.123.123.123, event 34, brown fox
我们如何在一行 SQL 中提取第二个数字,即 34 可靠?
我们在 MS SQL 中有以下行:
Got event with: 123.123.123.123, event 34, brown fox
我们如何在一行 SQL 中提取第二个数字,即 34 可靠?
这是使用的一种方法,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
只需替换@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
我想到了另一种尚未提及的方法。假设以下情况属实:
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”。我对性能与其他解决方案没有任何评论,它看起来一样混乱。我想我还是会把这个想法扔出去!