次の式から始めましょう。
(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' ||
CASE WHEN log.subtype is null
THEN ' '
ELSE log.subtype
END || ',%')
これは、この慣用句の例です。
','||a||',' LIKE '%,'||b||',%'
a
あなたのlt
パラメータであり、b
「タイプドットサブタイプ」文字列です。a
この比較は、カンマで区切られた値のリストである文字列と、単一の値である文字列があり、リストに値が含まれてb
いるかどうかを知りたいときにいつでも使用できます。a
b
なぜそのように書かれているのかを理解するには、まずこの試みをもっと簡単に見てみましょう:
a LIKE '%'||b||'%'
を取りb
、前後にワイルドカードを入れて、マッチさせa
ます。a
これは、たとえばis1,2,3
とb
isの場合に当てはまります2
。a
is12,34,56
とb
isの場合も残念ながら true になります2
。LIKE
コンマ区切りリストの解析は行わず、文字列の照合のみを行います。
次に、これを試してみてください:
a LIKE '%,'||b||',%'
b
isの場合2
、パターンは is %,2,%
- を含む任意の文字列に一致するため、 =,2,
の場合は true 、a
=の場合は1,2,3
false になります。残念ながら、2 の前にコンマがないため=についても false であり、2 の後にコンマがないため=についても false です。a
12,34,56
a
2,3,4
a
0,1,2
次の改善には 2 つの方法があります。個別のパターンケースを使用b
して、最初、中間、および最後に一致させることができますa
(この方法を使用する場合、正規表現を使用すると読みやすくなります!)
a
もう 1 つの方法は、既存のパターンに合わせて変更することです。0,1,2
または2,3,4
、リストの最初の要素とリストの最後の要素がコンマで囲まれていないため、一致しませんでした。しかし、a
一致する前にカンマを先頭に追加すると、リストの最初の要素がカンマで囲まれます! の末尾に別のコンマを追加a
して、最後の要素もコンマで囲まれるようにします。
','||a||',' LIKE '%,'||b||',%'
a
is0,1,2
とb
isの場合2
、LIKE
式は次のようになります。
',0,1,2,' LIKE '%,2,%'
これはマッチです!最初のワイルドカードが を吸収し,0,1
、,2,
が見つかります。最後のワイルドカードは、末尾の長さがゼロの部分文字列に一致しますが、これは許可されています。