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