ラベル SQL の投稿を表示しています。 すべての投稿を表示
ラベル SQL の投稿を表示しています。 すべての投稿を表示

2010年3月16日火曜日

CSVとSQL

CSVファイルに対してSQLを発行できるらしい。知らんかった。
サンプルはJScript。

var args = WScript.Arguments;
var fullName = args(0);

var fso = new ActiveXObject("Scripting.FileSystemObject");
var path = fso.GetParentFolderName(fullName);
var basename = fso.GetBaseName(fullName);
var filetype = fso.GetExtensionName(fullName);

var con = new ActiveXObject("ADODB.Connection");
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=" + path + ";"
+ "Extended Properties=\"text;HDR=YES;FMT=Delimited;\";";
con.Open();

// CSVファイルから、SQLでクエリ
var rs = con.Execute("select * from [" + basename + "#" + filetype + "] where sex = '男' order by Age;");
while (!rs.EOF) {
var id = rs.Fields("ID");
var name = rs.Fields("Name");
var age = rs.Fields("Age");
var address = rs.Fields("Address");
WScript.Echo(id + "," + name + "," + age + "," + address);
rs.MoveNext();
}

rs.Close();
con.Close();

読み込んだファイルは以下の通り
ID,Name,Age,Address,Sex
1,佐藤,30,東京,女
2,鈴木,12,北海道,男
3,高橋,35,兵庫,男
4,田中,28,愛媛,女
5,渡辺,14,愛知,女
6,伊藤,22,佐賀,男

2010年3月15日月曜日

SQLクエリ

以前のエントリで、データをプロパティに分解して格納する方法、検索方法がどのように変わるか検討してみた。

通常
<Person>テーブル

ID Name Age Address Sex

Select * From Person Where Age >= 20 And Age <= 29 And Sex='男'

20代男性を検索

分割
<Person>テーブル


IDPropertyNameValue
Select * From Person Where ID in
(Select Id From Person Where PropertyName = 'Age' And Value >= 20 And Value <= 29
Intersect
Select Id From Person Where PropertyName = 'Sex' And Value = '男')

AndはIntersectに、ORはUnionに変換すれば良さそう。でもパフォーマンス大丈夫か?