1

CASE を使用して、テーブル内のいくつかの州の略語をクリーンアップしていますが、ロジックに反して動作しています。長さが正しく計算されていることを示すために長さだけを選択したので、CASEロジックがオフになっていると思います

問い合わせると・・・

SELECT billing_state,
       length(billing_state),
       CASE billing_state
         WHEN length(billing_state) > 2 THEN (select state_abbr from lkup_states where upper(state_name) = billing_state)
         WHEN length(billing_state) = 2 THEN upper(billing_state)
         ELSE 'UNKNOWN'
       END as billing_state_fixed           
  FROM accounts
+---------------+-----------------------+---------------------+
| billing_state | length(billing_state) | billing_state_fixed |
+---------------+-----------------------+---------------------+
| GA            |                     2 | NULL                |
| Alabama       |                     7 | ALABAMA             |
| MS            |                     2 | NULL                |
| FL            |                     2 | NULL                |
| NULL          |                  NULL | UNKNOWN             |
+---------------+-----------------------+---------------------+

ただし、この奇妙なロジックに入ると、機能します。

SELECT billing_state,
       length(billing_state),
       CASE billing_state
         WHEN length(billing_state) = 2 THEN (select state_abbr from lkup_states where upper(state_name) = billing_state)
         WHEN length(billing_state) <> 2 THEN upper(billing_state)
         ELSE 'UNKNOWN'
       END as billing_state_fixed           
  FROM accounts

+---------------+-----------------------+---------------------+
| billing_state | length(billing_state) | billing_state_fixed |
+---------------+-----------------------+---------------------+
| GA            |                     2 | GA                  |
| Alabama       |                     7 | AL                  |
| MS            |                     2 | MS                  |
| FL            |                     2 | FL                  |
| NULL          |                  NULL | UNKNOWN             |
+---------------+-----------------------+---------------------+

誰でもこれでスイングできますか?

4

1 に答える 1

1

docsによると構文が正しくありません。

あなたは混乱CASE value WHEN compare_valueしていて、CASE WHEN expression.

おそらくあなたが望むのは:

SELECT billing_state,
       length(billing_state),
       CASE
         WHEN length(billing_state) > 2 THEN (select state_abbr from lkup_states where upper(state_name) = billing_state)
         WHEN length(billing_state) = 2 THEN upper(billing_state)
         ELSE 'UNKNOWN'
       END as billing_state_fixed           
  FROM accounts
于 2012-10-15T20:04:04.163 に答える