1 つまたは複数の州をリストできるフィールドがあります (callcenter.stateimpact)。callcenter.stateimpact に "OK"、"TX"、"AK"、"TN"、"NC"、"SC"、"GA"、"FL"、"AL"、"MS"、または "LA" が含まれている場合 I SQLの出力フィールドに「南」と表示する必要があり、そうでない場合は、出力に「北」と表示する必要があります。callcenter.stateimpact に南と北の両方の州がある場合、出力で「BOTH」と表示する必要があります。Select ステートメントでこれを行うにはどうすればよいですか? このテーブルのフィールドは、callcenter.callid、callcenter.stateimpact、callcenter.callstart、callcenter.callstop です。大変お世話になりました。
2 に答える
これは説明が難しいため、関連する値をレイアウトする SQL Fiddle hereがあります。
StateImpact(値を正規化する以外に) 私が思いついた最善の方法REGEXP_REPLACEは、文字列からすべての「南」状態を吸い出し、残った長さを調べることでした。まず、REGEXP_REPLACE(StateImpact, '(OK|TX|AK|TN|NC|SC|GA|FL|AL|MS|LA)')いくつかのサンプル値に対して行うことは次のとおりです。
StateImpact                   REGEXP_REPLACE(StateImpact, '(OK|TX|AK|TN|NC|SC|GA|FL|AL|MS|LA)')
----------------------------- -----------------------------------------------------------------
OK,TX,AK,TN,NC,SC,GA,FL,AL,MS ,,,,,,,,,
MI,MA                         MI,MA
TX                            null
TX,MI,MA                      ,MI,MA
したがって、すべてのコンマまたは null が残っている場合、すべての状態はSouth. 元の文字列が残っている場合、すべての状態はNorth. それ以外は何でもBoth。CASEこれは、どのように記述しても、かなり大きくて紛らわしいステートメントになります。次のように、前後の長さを比較しました。
- 置換後の長さ = 0 (または null):South
- 置換後の長さ = (前の長さ + 1) * 3 - 1:South
- 交換後の長さ=交換前の長さ:North
- 他に何か:Both
上記の 2 番目のものは、(たとえば) に 5 つの状態がStateImpactあり、それらがすべてSouthである場合、4 つのコンマが残るという事実を説明するための数学です。説明するのは難しいですが、うまくいきます:)
クエリは次のとおりです。
SELECT
  StateImpact,
  CASE NVL(LENGTH(REGEXP_REPLACE(StateImpact, '(OK|TX|AK|TN|NC|SC|GA|FL|AL|MS|LA)')), 0)
    WHEN LENGTH(StateImpact) THEN 'North'
    WHEN (LENGTH(StateImpact) + 1) / 3 - 1 THEN 'South'
    ELSE 'Both'
  END AS RegionImpact
FROM CallCenter
上記で参照されている SQL Fiddle は、 の前後の長さも示していREGEXP_REPLACEます。これは、計算の説明に役立つことを願っています。