SQL SERVER 2016 EXPRESSを使ってデータベースの操作を最近よくやっている。
以下はそのデータベース操作に関して最近ワテが覚えた手法のメモ。
あくまで初心者のメモと言う感じだ。
SQLを使いこなせる上級者の人にとっては常識レベルの内容だと思う。
特定のカラムが複数のデータの中のどれかに一致する行を取り出す
例えばテーブルの中から、カラム名 [CODE] の値が特定の値に等しいデータを取り出す場合だとこんなSQLになるかな。
SELECT * FROM [DBName].[dbo].[TableName] where [CODE] = 'B001JQ415E' );
コード1. 一つのデータに一致する場合のSQL
まあ、非常に簡単なSQLだ。
では、カラムが複数のデータのどれかに一致したらデータを取り出したい場合には、こんな感じか。
SELECT * FROM [DBName].[dbo].[TableName] where [CODE] in ( 'B001JQ415E', 'B00B3OXVIK', 'B00CS9LM0I' );
コード2. 複数のデータのどれかに一致する場合のSQL
in (なんちゃら, なんちゃら, なんちゃら)で複数のデータを与えてその中のどれかに等しい場合にSELECTを実行出来る。
さて、
C#でこれをSQLの文字列にする場合の小細工(ワテ流)
例えばこれらの三つの文字列がList<string>に入っているとする。
こんな感じ。
var codeLst = new List<string>(){ "B001JQ415E", "B00B3OXVIK", "B00CS9LM0I" }
それを上のコード2.の形式のSQL文字列にしたい。
まあ、文字列の処理なのでforループで回してシングルクォーテーションで囲ったり、カンマで連結したりすれば出来るので、殊更にヘンテコな方法を使う必要は無い。
でもまあ、最近のワテはLINQに凝っているのでLINQで書きたい。
二通りのLINQを書いてみた。
C#のstring.Join()を使う
多数の文字列をセパレーターを指定して連結するのによく使うのが string.Join()だ。
それとLINQの組み合わせでやってみた。
const string SQ = "'"; string strJoin1 = string.Join( ",", codeLst.Select(x => SQ + x + SQ ).ToArray() ); // strJoin1 = "'B001JQ415E', 'B00B3OXVIK', 'B00CS9LM0I'" になる。
LINQのSelectの部分で SQ + x + SQ で文字列をシングルクォートで囲って ‘B001JQ415E’ こんな感じにする。それらをstring.Joinでカンマで連結する。
Aggregate()でも連結出来る
このAggregate()は、覚えた当初は使い方が良く分からなかったのであまり使わなかった。
でも、慣れて来るととっても便利。
var strJoin2 = SQ + codeLst.Aggregate((a, b) => a + "', '" + b) + SQ; // strJoin2 = "'B001JQ415E', 'B00B3OXVIK', 'B00CS9LM0I'" になる。
要するにリストとか配列とか、そういう複数の要素を持っているデータに対して(今はcodeLst)、連続する二つの要素 a,b を
a + "', '" + b
のように連結するように指示している。
つまり、こんな文字列が出来上がる。
B001JQ415E', 'B00B3OXVIK', 'B00CS9LM0I
その前後にシングルクォートを追加してやると、
'B001JQ415E', 'B00B3OXVIK', 'B00CS9LM0I'
目的の文字列が得られた。
あとは、この文字列にSELECT
や FROMなどを追加すると目的のSQL文を文字列で生成出来る。
これをC#で実行してやれば、SQL実行結果を取得出来る。
まとめ
以上、SQL初心者のワテの手法なので、正統派の方法なのかどうか未確認。
ちゃんとしたSQLの本を読むならお勧めはこれだ。
著者の松本 美穂 , 松本 崇博さんは、この業界では超有名人のようだ。
ネットで勉強する
本格的にプログラミングを勉強するなら、有料になるがこういうサイトもお勧めだ。
ネットを利用して学習出来るので、自宅に居ながらにしてプログラミングを習得できる。
この会社ではWEBプログラミングの学習が出来るようだが、WEBプログラミングでは MySQLなどのデータベースも使うので、独学でやるよりも講師の人に教えて貰うほうが効率が良いだろう。
コメント