読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

LambdicSql - α 0.0.13リリース - IS NULL 対応

IS NULL 対応しました。
www.nuget.org

最初は IS NULL は何かキーワードを用意して特殊対応にしようと思ってました。int値の時とか面倒ですしね。でも、@yone64さんが、「昔にこの問題に対応したことがある」的なことを言っていたので、やっぱりnullの時に IS NULL に自動で変換した方が便利かなーって思って対応しました。

*あれ?最近のDBはNULLキーワードが主流なようですね。NULLキーワードで比較するようにしました。

SQL作成に使う型です。

//スタッフテーブル
public class Staff
{
    public int id { get; set; }
    public string name { get; set; }
}
//報酬テーブル
public class Remuneration
{
    public int id { get; set; }
    public int staff_id { get; set; }
    public DateTime payment_date { get; set; }
    public decimal money { get; set; }
}
//二つのテーブル定義を持つ
public class DB
{
    public Staff tbl_staff { get; set; }
    public Remuneration tbl_remuneration { get; set; }
}
//Select句で使う定義
public class SelectData
{
    public string name { get; set; }
    public DateTime payment_date { get; set; }
    public decimal money { get; set; }
}

null比較すると、IS NULL になります。
値型の場合はNullable<>で比較するという仕様です。
この例ではmoneyをdecimal?のパラメータと比較することで値型でも IS NULL のクエリを生成できています。

public void IsNull()
{
    decimal? val = null;
    var query = Sql<DB>.Create(db=>
        Select(new SelectedData()
        {
            Name = db.tbl_staff.name,
            PaymentDate = db.tbl_remuneration.payment_date,
            Money = db.tbl_remuneration.money,
        }).
        From(db.tbl_remuneration).
            Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id).
        Where(db.tbl_staff.name == null || db.tbl_remuneration.money == val));

    //文字列化
    Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText);

    //Dapperを使っているなら、以下のように実行できます
    var datas = _connection.Query(query).ToList();
}
SELECT
tbl_staff.name AS Name,
	tbl_remuneration.payment_date AS PaymentDate,
	tbl_remuneration.money AS Money
FROM tbl_remuneration
	JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id)
WHERE ((tbl_staff.name) = (NULL)) OR ((tbl_remuneration.money) = (NULL))

!= で比較すると IS NOT NULL になります。

public void IsNotNull()
{
    decimal? val = null;
    var query = Sql<DB>.Create(db=>
        Select(new SelectedData()
        {
            Name = db.tbl_staff.name,
            PaymentDate = db.tbl_remuneration.payment_date,
            Money = db.tbl_remuneration.money,
        }).
        From(db.tbl_remuneration).
            Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id).
        Where(db.tbl_staff.name != null || db.tbl_remuneration.money != val));

    //文字列化
    Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText);

    //Dapperを使っているなら、以下のように実行できます
    var datas = _connection.Query(query).ToList();
}
SELECT
tbl_staff.name AS Name,
	tbl_remuneration.payment_date AS PaymentDate,
	tbl_remuneration.money AS Money
FROM tbl_remuneration
	JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id)
WHERE ((tbl_staff.name) <> (NULL)) OR ((tbl_remuneration.money) <> (NULL))

履歴

2016/09/02 β版対応