0

SQL Server に IP アドレスを含むレコードが 1,000 万件以上あります。アドレスをさらに分析するには、アドレスを解析して別の列にする必要があります。機能する PATINDEX を使用してみましたが、IP アドレスのパターンは 1 つしかカバーしていません。最初のオクテットは 50、41、または 107 である必要があります。残りの 3 つのオクテットは、1 桁から 3 桁の範囲です。私が使用したのは、50/41/107.xxx.xxx.xxx の catpures です。

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

1 つのクエリですべての IP パターン (50.x.xxx.xxx、50.xx.x.xxx など) を取得するにはどうすればよいですか?

4

3 に答える 3

0

このクエリは、4 オクテットのみの IP アドレスのみをキャプチャしていることを確認します。

すべてのオクテットは指定された範囲内にある必要があります (現在は 0 ~ 255 に設定されていますが、where 句で変更できます)。BETWEEN a AND 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
于 2015-01-12T18:08:49.773 に答える