sql >> データベース >  >> RDS >> Oracle

where句の関数をOracleで1回実行するように強制するにはどうすればよいですか?

    なぜこれにPL/SQLを使用しているのですか?あなたがいくつかの数学をしているとあなたが言ったことから、なぜそれをSQLでやらないのですか?これは、INSTRとSUBSTRの組み合わせでも可能ですが、REGEXP_SUBSTRで確認する方がきれいです。

    select to_number(regexp_substr(ip, '[^.]+', 1, 1)) * power(2,24)
            + to_number(regexp_substr(ip, '[^.]+', 1, 2)) * power(2,16)
            + to_number(regexp_substr(ip, '[^.]+', 1, 3)) * power(2,8)
            + to_number(regexp_substr(ip, '[^.]+', 1, 4))
         , icb.*
         , icl.* 
      from ip_city_block icb
      join ip_city_location icl
        on icl.locid = icb.locid  
     where to_number(regexp_substr(ip, '[^.]+', 1, 1)) * power(2,24)
            + to_number(regexp_substr(ip, '[^.]+', 1, 2)) * power(2,16)
            + to_number(regexp_substr(ip, '[^.]+', 1, 3)) * power(2,8)
            + to_number(regexp_substr(ip, '[^.]+', 1, 4))
           between icb.startipnum and icb.endipnum
    

    REGEXP_SUBSTR出力のSQLFiddleデモンストレーション

    持っている場合 PL / SQLでこれを行うには、次の2つのことを行う必要があります。

    1. 関数をとして宣言できるかどうかを確認します決定論的 。
    2. subを試して活用してください-クエリキャッシュ

    すでに2を実行しているように見えますが、WITH句を使用してこれを拡張することができます:

    with the_ip as ( select get_ip_integer('74.253.103.98') as ip from dual )
    select the_ip.ip
         , icb.*
         , icl.* 
      from ip_city_block icb
      join ip_city_location icl
        on icl.locid = icb.locid
      join the_ip
        on the_ip.ip between icb.startipnum and icb.endipnum
    


    1. 一意のキーを使用せずにテーブルから重複する行を削除する

    2. MySQL DBのすべてのテーブルのプレフィックスを変更するにはどうすればよいですか?

    3. PostgresDBサイズコマンド

    4. Oracle結合-従来の構文とANSI構文の比較