在SQL Server中查找IP地址

在SQL Server中查找IP地址,sql,sql-server,patindex,Sql,Sql Server,Patindex,我有超过1000万条记录包含SQL Server中的IP地址。我需要将地址解析成一个单独的列来进一步分析它们。我曾尝试使用一个PATINDEX,它可以工作,但只包含一种IP地址模式。第一个八位组必须是50、41或107。其他三个八位字节的范围从一位数到三位数。以下是我使用的catpures 50/41/107.xxx.xxx.xxx: SELECT SUBSTRING(Column_1,PATINDEX('%[50|41|107].[0-9][0-9][0-9].[0-9][0-9][0-9]

我有超过1000万条记录包含SQL Server中的IP地址。我需要将地址解析成一个单独的列来进一步分析它们。我曾尝试使用一个PATINDEX,它可以工作,但只包含一种IP地址模式。第一个八位组必须是50、41或107。其他三个八位字节的范围从一位数到三位数。以下是我使用的catpures 50/41/107.xxx.xxx.xxx:

SELECT  SUBSTRING(Column_1,PATINDEX('%[50|41|107].[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9]%',Column_1)-2,14)
FROM    table_1

如何在一次查询中捕获所有IP模式(50.x.xxx.xxx、50.xx.x.xxx等?

使用
Charindex
字符串函数。试试这个

select * from table_1 where
left(Column_1,charindex('.',Column_1)-1) in('50','41','107')

您可以使用
PARSENAME

SELECT *
FROM dbo.YourTable
WHERE PARSENAME(YourColumn,4) = '50'

此查询将确保您只捕获只有4个八位字节的IP地址

所有八位字节都需要在指定的范围内(当前设置为0-255,但可以在where子句中更改)。您还可以将a和b之间的更改为in(a,b,…),它将只捕获这些特定的数字

它还以整数的形式返回它们自己列中的八位字节,这是一种很好的存储它们的方法,以备将来需要对特定范围进行分析时使用,这样以后就不需要解析文本了

注意:由于使用了TRY_CAST,因此这仅适用于SQL Server 2012和

WITH Octet_Position (column_1, position_1, position_2, position_3)
AS
(
    SELECT
        column_1,
        CHARINDEX('.', column_1),
        CHARINDEX('.', column_1, CHARINDEX('.', column_1) + 1),
        CHARINDEX('.', column_1, (CHARINDEX('.', column_1, CHARINDEX('.', column_1) + 1)) + 1)
    FROM Table_1
)
SELECT
    column_1 AS ip_address,
    TRY_CAST(SUBSTRING(column_1, 0, position_1) AS INT) AS octet_1,
    TRY_CAST(SUBSTRING(column_1, position_1 + 1, position_2 - position_1 - 1) AS INT) AS octet_2,
    TRY_CAST(SUBSTRING(column_1, position_2 + 1, position_3 - position_2 -  1) AS INT) AS octet_3,
    TRY_CAST(SUBSTRING(column_1, position_3 + 1, LEN(column_1) - position_3) AS INT) AS octet_4
FROM Octet_Position
WHERE
    --make sure there are three .'s
    position_1 > 0 AND
    position_2 > 0 AND
    position_3 > 0 AND

    --Make sure the octets are numbers
    TRY_CAST(NULLIF(SUBSTRING(column_1, 0, position_1), '') AS INT) IS NOT NULL AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_1 + 1, position_2 - position_1 - 1), '') AS INT) IS NOT NULL AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_2 + 1, position_3 - position_2 -  1), '') AS INT) IS NOT NULL AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_3 + 1, LEN(column_1) - position_3), '') AS INT) IS NOT NULL AND

    --make sure the octects are in the correct range
    TRY_CAST(NULLIF(SUBSTRING(column_1, 0, position_1), '') AS INT) BETWEEN 0 AND 255 AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_1 + 1, position_2 - position_1 - 1), '') AS INT) BETWEEN 0 AND 255 AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_2 + 1, position_3 - position_2 -  1), '') AS INT) BETWEEN 0 AND 255 AND
    TRY_CAST(NULLIF(SUBSTRING(column_1, position_3 + 1, LEN(column_1) - position_3), '') AS INT) BETWEEN 0 AND 255

如果支持标准正则表达式表示法,您可能指的是
\d{1,3}
,而不是
[0-9][0-9][0-9]