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

时间:2013-02-19 13:48:24

标签: sql sql-server

我们在MS SQL中有以下行:

Got event with: 123.123.123.123, event 34, brown fox

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

3 个答案:

答案 0 :(得分:1)

以下是使用SUBSTRINGPATINDEX执行此操作的一种方法 - 我使用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)

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

  • 在第二个“部分”之前始终有一个逗号
  • 第二部分中的数字始终是“事件”一词
  • 您正在使用SQL Server 2005 +

然后你可以使用内置的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解析点,但我们希望它用逗号解析。这是我所做的逻辑:

  1. 删除字符串中的所有现有点,在这种情况下用空字符串交换它们。
  2. 将所有逗号换成ParseName以使用
  3. 使用ParseName并要求第二个“片段”。在你的例子中,这给了我们价值 “事件34”。
  4. 从字符串中删除“event”一词。
  5. 修剪两端并返回值。
  6. 我对性能与其他解决方案没有任何评论,它看起来同样混乱。不管怎样我以为我会把这个想法扔出去!

相关问题