人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

以下update実行しました。

update table set gakunen =
case
when ltrim(substr(uketukebi,5,2),'0') >= 4 then
case
when sotunen - substr(uketukebi,1,4) = '1' then 3
when sotunen - substr(uketukebi,1,4) = '2' then 2
when sotunen - substr(uketukebi,1,4) = '3' then 1
when sotunen - substr(uketukebi,1,4) > '3' then 0
when sotunen - substr(uketukebi,1,4) < '1' then 4
end
when ltrim(substr(uketukebi,5,2),'0') < 4 then
case
when sotunen - substr(uketukebi,1,4) = '0' then 3
when sotunen - substr(uketukebi,1,4) = '1' then 2
when sotunen - substr(uketukebi,1,4) = '2' then 1
when sotunen - substr(uketukebi,1,4) >= '3' then 0
when sotunen - substr(uketukebi,1,4) < '0' then 4
end
end
卒年と受付日から学年を割り出してセットするといったものなのですが、
こちらを実行後に、不可思議なレコードがあります。

SOTUNEN UKETUKEBI gakunen
2013 20120301074506 3
上記の学年が3となりますが、2が正解です。
なのに、なぜか3になります。
原因はなんでしょうか。

●質問者: FujiiRock
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●0ポイント

when ltrim(substr(uketukebi,5,2),'0') >= 4 then

ここで取得されるltrim(substr(uketukebi,5,2),'0')は '3'となるため

'3'>=4 と比較される。

数値より文字のほうが 大きいため 最初の分岐になると思われます。

ちなみに

update table set gakunen =
case
when ltrim(substr(uketukebi,5,2),'0') >= 4 then
case
when sotunen - substr(uketukebi,1,4) = '1' then 5
when sotunen - substr(uketukebi,1,4) = '2' then 2
・・・
とかやった場合は、5になりませんか?


FujiiRockさんのコメント
ありがとうございます!! やりたいこととしては、受付日(uketukebi)と卒年(sotunen)から学年を算出するなのですが、なので、卒年が2014年で受付日が2013年9月7日の場合は、学年は3年生としていますので、5になるかならないかといいますと、ならないと思っています。

2 ● うぃんど
●100ポイント ベストアンサー

明確にcastしたほうが良いでしょう。

when ltrim(substr(uketukebi,5,2),'0') >= 4 then
  ↓
when cast(substr(uketukebi,5,2) as integer) >= 4 then

when ltrim(substr(uketukebi,5,2),'0') < 4 then
  ↓
else

一発

UPDATE table SET gakunen =
min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) )

FujiiRockさんのコメント
ありがとうございます!! 一発の方でもできるんですね。おはずかしながら、ひも解けませんでした、うーん。すばらしい。

うぃんどさんのコメント
順に文字を当てはめて検証してください。 (0)データ準備 UKETUKEBI 20120301074506 SOTUNEN 2013 (1)年月の形にお互いを整える substr( uketukebi, 1, 6 ) = 201203 sotunen * 100 + 3 = 201303 (2)差引して年の単位にする ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = (201203 - 201303) / 100 = -1.0 (3)学年を求める 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2 (4)最小値でフィルタリング(ゼロか結果のどちらか大きいほうを選択する) max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2 (5)最大値でフィルタリング(4か結果のどちらか小さいほうを選択する) min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) ) = 2 SQLに迷ったときは目に見える形で確認したほうが楽なので、 今回はCaleで下記のような式を作り、php+SQLite3に移植して軽くですが動かしました。 設計ミスがないか、そちらでも確認してから使ってください。 A列にSOTUNEN B列にUKETUKEBI C列に=MIN(4,(MAX(0,3+(VALUE(MID(B1,1,6)) - VALUE(A1&"03"))/100)))

FujiiRockさんのコメント
ありがとうございました!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ