0

我们在 MS SQL 中有以下行:

Got event with: 123.123.123.123, event 34, brown fox

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

4

3 回答 3

2

这是使用的一种方法,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
于 2013-02-19T14:08:10.663 回答
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
于 2013-02-19T14:17:53.690 回答
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. 修剪两端并返回值。

我对性能与其他解决方案没有任何评论,它看起来一样混乱。我想我还是会把这个想法扔出去!

于 2013-02-19T14:41:19.737 回答