0

私はデータ型の異なる国のプレート番号のサンプルデータを持っていますがvarchar2、まったく制限はありません:

plate_number
-------
KL AB 1234
DB-2034
kl_c_3341
12/34
other123

入力のために、選択クエリで上記のすべての結果を取得する必要があります: (サンプル構文)

WHERE plate_number in('kl-ab-1234', 'db 2034', 'klC3341', 'oTher 123', '1234');

検索入力は、スペース、スラッシュ、ハイフン、大文字、または小文字を使用して、または使用せずに区切ることができます。

LIKE、substr、regexp_substr、および regexp_replace も使用してみましたが、目的の出力が得られません。

上記は簡単で論理的ではないかもしれませんが、これは今後の使用のための私の練習のためだけです.

前もって感謝します。

4

2 に答える 2

1

代替として、可能なすべての入力パターンを列挙する正規表現を使用できます。パターンの特異性を最大化し、部分的な一致を避けるために、開始/終了アンカーを含めることを忘れないでください。次のテンプレートは、サンプル セットを使用します。

WHERE REGEXP_INSTR (
          REGEXP_REPLACE(plate_number, '[ -/]', '')
        ,             '^('
                   || '[[:alpha:]]{1,3}[[:alpha:]]{1,2}[[:digit:]]{2,4}'
            || '|' || '[[:alpha:]]{2}[[:digit:]]{4}'
            || '|' || '[[:alpha:]]+[[:digit:]]{3}'
            || '|' || '[[:digit:]]{4}'
                   || ')$'
        , 1, 1, 0
        , 'i'
      ) > 0

最初のパターンは、ドイツのナンバー プレート テキストの構造に関する直接の知識に基づいています。必要に応じてパターンを追加します。いずれにせよセパレータはオプションであり、文字/数字の範囲外であるため、実際のマッチングの前に省略できます。重複する一致セットを持つパターンを期待します。それらを分離しておくことで保守性が大幅に向上し、分類する必要がないため害はありません。

于 2013-07-25T08:25:22.697 に答える
0

ありがとう@ABCade、そしてこれは私がリンクから得たものです

SELECT *
FROM my_table3
WHERE lower(regexp_replace(word, '[^0-9a-zA-Z]+', '')) IN(
lower(regexp_replace('kl-ab-1234' , '[^0-9a-zA-Z]+', '')),
lower(regexp_replace('db 2034' , '[^0-9a-zA-Z]+', '')),
lower(regexp_replace('klC3341' , '[^0-9a-zA-Z]+', '')),
lower(regexp_replace('oTher 123' , '[^0-9a-zA-Z]+', '')),
lower(regexp_replace('1234 ' , '[^0-9a-zA-Z]+', '')));

他の良い解決策は大歓迎です。

于 2013-07-25T08:16:34.677 に答える