Oracle正規表現関数を使用した問合せの例

ここに示す問合せの例では、Oracle正規表現関数を使用してOracle NoSQL Database rmvTableを問い合せる方法を示します。

姓列の値が文字「H」で始まるOracle NoSQL Database rmvTableの各行から名、姓、住所および車両情報配列を表示するには、次の問合せを実行します。

SELECT firstname,lastname,address,vehicleinfo FROM rmvTable WHERE 
    REGEXP_LIKE (lastname, '^[H].*');

Oracle NoSQL Database rmvTablevehicleinfoフィールドは、Oracle Database STRING型にマップされたOracle NoSQL Database RECORD型の配列であり、指定されたRECORDの各要素は、Oracle Databaseデータ・モデルにマップされる際に名前と値のペアとして、たとえば、''make":"Chrysler"、''color":"red"、''paid":trueのように表されます。

たとえば、1台目の(主要な)車両が特定の基準に一致するデータベース内の各個人の名前と住所をリストするとします。さらに、vehicleinfo配列の各要素をリストするのではなく、目的の基準に一致する車両に関連する車両情報のみをリストするとします。つまり、特定の所有者に関連付けられている他の車両に関する情報をリストする必要はありません。

たとえば、1台目の車両がGM社製であるすべての所有者、またはCamaroを所有するすべての所有者をリストできます。あるいは、1台目の車両が登録されていない所有者をすべてリストすることが必要になる場合があります。各所有者の1台目の車両に関する情報がvehicleinfo配列の最初の要素に格納されていると仮定した場合、前述の種類の基準に一致するように、次の各問合せでOracle正規表現関数を使用します。具体的には、次のようになります。

1台目の車両がGM社製であるすべての所有者を検索するには、次のようにします。

SELECT firstname,lastname,address,
    REGEXP_SUBSTR(
        VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,1) 
    "Primary make: GM"
    FROM rmvTable WHERE 
    REGEXP_LIKE (
        REGEXP_SUBSTR(
            VEHICLEINFO,'\{([[:alnum:]":,\.]+){1,3}\}',1,1), 
                   '"make":"GM"');

1台目の車両がCamaroであるすべての所有者を検索するには、次のようにします。

SELECT firstname,lastname,address,
    REGEXP_SUBSTR(
        VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,1)
    "Primary model: Camaro"
    FROM rmvTable WHERE 
    REGEXP_LIKE (
        REGEXP_SUBSTR(
            VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,1), 
                '"model":"Camaro"');

1台目の車両が登録されていないすべての所有者を検索するには、次のようにします。

SELECT firstname,lastname,address,
    REGEXP_SUBSTR(
        VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,1) 
    "Primary fee NOT paid" 
    FROM rmvTable WHERE 
    REGEXP_LIKE (
        REGEXP_SUBSTR(
            VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,1), 
                '"paid":false');

2台目の車両がトラックであるすべての所有者を検索するには、次のようにします。

SELECT firstname,lastname,address,
    REGEXP_SUBSTR(
        VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,2)
    "Second vehicle type: truck"
    FROM rmvTable WHERE 
    REGEXP_LIKE (
        REGEXP_SUBSTR(
            VEHICLEINFO, '\{([[:alnum:]":,\.]+){1,3}\}',1,2), 
                '"type":"truck"');