Home > タグ > プログラミング

プログラミング

SQL Serverの秘密

どうも!僕です。


仕事中です(;´Д`)

むしゃくしゃしたのでSQL Server 2000のストアド内で
配列操作っぽいことをする方法を考えておりました。

以下考えてみた方法です。

1.テーブル変数を使う方法
これは、結構オーソドックスなんではないでしょうか?

declare @a table(cd int, dat varchar(10))
declare @b table(cd int, dat varchar(10))

insert into @a (cd,dat) values (1,’A')
insert into @a (cd,dat) values (2,’B')
insert into @a (cd,dat) values (3,’C')
insert into @a (cd,dat) values (4,’D')
insert into @a (cd,dat) values (5,’E')

insert into @b (cd,dat) values (1,’A')
insert into @b (cd,dat) values (2,’B')
insert into @b (cd,dat) values (3,’R')
insert into @b (cd,dat) values (4,’D')
insert into @b (cd,dat) values (5,’Q')

select convert(varchar,a.cd) + ‘番目の”‘ + a.dat + ‘”と”‘ + b.dat + ‘”が違う’
from @a a, @b b where a.cd = b.cd and a.dat <> b.dat

利点:
テーブル変数のキー列を利用することによって、ループをまわす必要なく
配列(っポイものの)操作が出来る。(例のselect文)
テーブル変数を可変長配列みたいにして使える。
select dat from @a where cd = 3とかでインデックスアクセスっぽいことが出来るかも。

欠点:
使い道が限られるかも。

2.CASE文を使う方法
見た目重視。

declare @a varchar(10)
declare @b varchar(10)
declare @c int

set @c = 5

while @c > 0
begin
set @a = case @c
when 1 then ‘あ’
when 2 then ‘い’
when 3 then ‘う’
when 4 then ‘え’
when 5 then ‘お’
else ” end
set @b = case @c
when 1 then ‘あ’
when 2 then ‘い’
when 3 then ‘し’
when 4 then ‘て’
when 5 then ‘る’
else ” end
if @a <> @b
begin
select ‘”‘ + @a + ‘”と”‘ + @b + ‘”が違う’
end

set @c = @c - 1
end

利点:
見た目がいい。かもしれない。

欠点:
1のやり方より、さらに使い勝手が悪いかも。

本当は、こんなことを書きたかったわけじゃないんですよ。
タイトルにある通り、SQL Serverの秘密を発見してしまいまして・・・
知ってる人は知ってるのかもしれません。
これをやって、徹夜明けに独りほくそ笑んでる開発者も
すでにこの世には居るのかもしれません。

秘密を見るのは簡単です。
次の魔法の言葉をクエリアナライザに打ち込むだけです。

select char(15)

それでは皆さんごきげんよう!

生まれてから何日経ったか

本当はこれ、20日に書かなきゃいけなかったことなんですが、

わたくし、8月20日に誕生日を迎えまして、26歳になってしまいました。

26歳なんておっさんじゃないですか。
会社の人はみんな10歳以上年上なので、まだ若者のつもりでいたのですが、
今、新卒が入ってきたら4歳も年上じゃないですか。
おっさんですよ紛れもなく。
そして肝臓からはγ-GTP垂れ流し。

でまぁ、誕生日だと言っても、友達一人からちょっとしたプレゼントもらったり(感謝!)
好きな人に耳元で「お誕生日おめでとう」と囁かれた以外は、
休日出勤で普通に仕事でした。

ええ、実は今回は実験とか研究とかと言えるものは何もしてないのです。
仕事も忙しいし。
って割には会社のおっさん3人でエアガンを使った射的大会を事務所内でやってましたが。

しかし、ネタは作るもの。
生まれてから26歳の誕生日まで何日経ったか計算してみます。

ただ、普通に手計算してもマンドイだけなので、プログラム組んで計算してみます。

使用言語はなんと・・・Concurrent Clean!!!

関数型言語ですよ。
http://sky.zero.ad.jp/~zaa54437/programming/clean/
ここを参考にしながら(パクリながら)作ってみました。
いきなり以下ソースです。

module testproj

import StdEnv, StdDebug

//***** 生まれて何日経ったか *****
Start =dateDiff 1980 8 20 2006 8 20

//閏年か否か
isLeap year = (year rem 4 == 0) && ((not (year rem 100 == 0)) || (year rem 400 == 0))

//年の日数を返す
daysOfYear year
|isLeap year = 366
|otherwise = 365

//月の日数を返す
daysOfMonth year month
|month == 1 = 31
|(month == 2) && (isLeap year) = 29
|(month == 2) && (not (isLeap year)) = 28
|month == 3 = 31
|month == 4 = 30
|month == 5 = 31
|month == 6 = 30
|month == 7 = 31
|month == 8 = 31
|month == 9 = 30
|month == 10 = 31
|month == 11 = 30
|month == 12 = 31

//0年1年1日からの経過日数を返す
dateSerial year month day
= sum (map (\x->daysOfYear (trace (toString x +++ “\t”) x)) [0..year - 1])
+ sum (map (\x->daysOfMonth year x) [1..month - 1])
+ day

//2つの日付の差を日数で返す
dateDiff sYear sMonth sDate dYear dMonth dDate
= (dateSerial dYear dMonth dDate) - (dateSerial sYear sMonth sDate)

以上ソース終わり。

デバッグ用のコードが紛れ込んでるのでこのままでは実行結果が汚いですが、
一応、26歳の誕生日で9496日経ったと結果が出ました。
合ってるかどうかは分かりませんが、たぶんそのくらいでしょうw
9496を365で割ったら26.~ってなったのでたぶんあってると思いますw

にしても関数型言語ってなんか夢を感じます。なんとなく。
ってのを今回の結論とさせていただき、今回は終わりたいと思います。なんだそれ。

トップページ > タグ > プログラミング

検索
フィード
メタ

ページの最初に戻る