法的説明の四半期データを検証するクエリに取り組んでいます。私たちの標準は、南東の四分の一を示す「SE/4」または北西の四分の一の南東の四分の一を示す「SE/4 NW/4」のような入力です。スペースまたは文字列の終わりをチェックするために正規表現で構造化する方法に苦労しています。
これまでの正規表現を使用したサンプルデータをいくつか示します。
WITH test_data AS (
SELECT 'NW/4' AS quarter_cd FROM dual UNION ALL --VALID
SELECT 'E/2 SW/4' FROM dual UNION ALL --VALID
SELECT 'W/2' FROM dual UNION ALL --VALID
SELECT 'SW/4 NE/4' FROM dual UNION ALL --VALID
SELECT 'SW/4 NE/4 NW/4' FROM dual UNION ALL --VALID, THEY CAN REPEAT AN UNKNOWN NUMBER OF TIMES
SELECT 'E/2 N/2' FROM dual UNION ALL --TECHNICALLY VALID BUT WOULD LIKE TO EXCLUDE (1/2 of 1/2 is a 1/4) -> NE/4
SELECT 'E/2 SW/4, SE/4' FROM dual UNION ALL --INVALID, HAS A COMMA (TWO QUARTER ENTRIES ON ONE ROW)
SELECT 'E/2 SW/4 & SE/4' FROM dual UNION ALL --INVALID, HAS AN AMPERSAND (TWO QUARTER ENTRIES ON ONE ROW)
SELECT 'E/2 SW/' FROM dual UNION ALL --INVALID, INCOMPLETE ENTRY
SELECT 'SE/4SW/4' FROM dual UNION ALL --INVALID, NO SPACE BETWEEN DEFINITIONS
SELECT 'SE/2' FROM dual UNION ALL --INVALID, SOUTHEAST HALF DOES NOT MAKE SENSE
SELECT 'N/4' FROM dual UNION ALL --INVALID, NORTH QUARTER DOES NOT MAKE SENSE
SELECT 'LOT 1' FROM dual --INVALID, LOTS WILL BE DEALT WITH SEPARATELY
)
SELECT * FROM test_data
WHERE regexp_like(quarter_cd, '^([NSEW]/[2]{1}|[NSEW]{2}/[4]{1})+', 'c');
私のコードの正規表現は、私の多くの試みの 1 つにすぎません。返す必要がある結果をクエリでマークしました。簡単にするために「E/2 N/2」が返されることを許可しますが、北半分の東半分は北東四半期に単純化するのが最善であるため、技術的には無効です。上記のすべての例は、私のデータの実際のエントリから抽出されました。
どんな助けでも大歓迎です。