0

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 です。大変お世話になりました。

4

2 に答える 2

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. それ以外は何でもBothCASEこれは、どのように記述しても、かなり大きくて紛らわしいステートメントになります。次のように、前後の長さを比較しました。

  • 置換後の長さ = 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ます。これは、計算の説明に役立つことを願っています。

于 2013-06-10T16:10:33.317 に答える