Home > タグ > プログラミング
プログラミング
SQL Serverの秘密
- 2006-12-04 (月)
- 技術
どうも!僕です。
仕事中です(;´Д`)
むしゃくしゃしたので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)
それでは皆さんごきげんよう!
仕事中です(;´Д`)
むしゃくしゃしたので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
にしても関数型言語ってなんか夢を感じます。なんとなく。
ってのを今回の結論とさせていただき、今回は終わりたいと思います。なんだそれ。
わたくし、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
にしても関数型言語ってなんか夢を感じます。なんとなく。
ってのを今回の結論とさせていただき、今回は終わりたいと思います。なんだそれ。
トップページ > タグ > プログラミング
- 検索
- フィード
- メタ