【DBFlute】外だしSQL構文一覧

# 単純コメント
- ユーザが自由に設定できる無為コメント

```sql
  -- 行コメント
  /* ブロックコメント */
```

# バインド変数コメント
- SQLに渡すバインド変数を定義する。
- 「pmb.任意の名前」で定義する。

```sql:バインド変数コメント
    -- 数値 (Integer)
    DEARTMENT.ID = /*pmb.id*/20

    -- 文字列 (String)
    DEARTMENT.NAME = /*pmb.name*/''
    DEARTMENT.NAME = /*pmb.name*/'20'

    -- IN句 (List<String>)
    DEPARTMENT.ID IN /*pmb.id*/()
    DEPARTMENT.ID IN /*pmb.id*/('10')
            (List<Integer>)
    DEPARTMENT.ID IN /*pmb.id*/(10)

    -- 日付 (LocalDate)
    D.START_DATE = /*pmb.startDate*/date '2019-04-01'
```

# IFコメント
- 条件を満たした場合、IFコメント内の文字列が展開される。

```sql:IFコメント
   /*検索条件*/
     条件を満たした場合ここの記述が展開される。
   /*END*/

   -- 文字列
   /*IF pmb.name > '総務部'*/

   -- 数値 
   /*IF pmb.id >= 100*/

   -- 日付
   /*IF pmb.startDate > date '2019-04-01'*/

   -- 論理値 (true, false)
   /*IF pmb.testFlag*/
   /*IF !pmb.testFlag*/

   -- AND 条件
   /*IF pmb.memberId == 100 && pmb.menberId == 200*/

   -- OR 条件
   /*IF pmb.memberId == 100 || pmb.menberId == 200*/

   -- 未設定でない
   /*IF pmb.memberName != null && pmb.menberName != ''*/
```

## 複雑なIF文をjavaで定義する。
- AND,ORの併用ができない場合や，複雑な条件の場合はPmbクラスに判定メソッドを定義する。
 
```java:DeartmentByPkPmb.java
	public boolean complexCondition() {
		if (10 <= this._id && this._id <= 20) {
			return true;
		} else if (this._id % 4 == 0) {
			return true;
		}
		return false;
	}
```
```sql:sqlファイル
    /*IF pmb.complexCondition()*/
      D.ID = /*pmb.id*/10
    /*END*/
```


# ELSEコメント
 - IFコメントを満たさない場合に実行される。
 - IF文の『内側』に書かないといけない。
 - 行コメントのみ使用可能
 - 複数記述可能
 
```sql:ELSEコメント
    /*IF pmb.id != null*/
      D.ID = /*pmb.id*/10
      --ELSE D.ID = '10'
      --ELSE AND D.START_DATE = '2019-04-01'
      --ELSE AND D.END_DATE =   '2020-03-31'
    /*END*/
```
```sql:ELSEコメントをIF文で代替
    /*IF pmb.id != null*/
      D.ID = /*pmb.id*/10
    /*IF pmb.id == null*/
      D.ID = '10'
        AND D.START_DATE = '2019-04-01'
        AND D.END_DATE =   '2020-03-31'
    /*END*/
```

# BEGINコメント
 - BEGIN内のすべての条件がfalseの場合，BEGIN内の記述をすべて削除する。
 - where句やAND句の取りこぼしを削除するために使用する。

## パターン1 (id = null, name = '人事部')
### BEGINコメントなし
```sql:展開前
　WHERE
    /*IF pmb.id != null*/
  　D.ID = /*pmb.id*/10
    /*END*/
    /*IF pmb.name != null*/
  　AND D.NAME = /*pmb.name*/'総務部'
    /*END*/
```
```sql:展開後
　WHERE
  　AND D.NAME = '人事部' ★構文エラー : ANDから始まっている。
```
### BEGINコメントあり
```sql:展開前
  /*BEGIN*/
　WHERE
    /*IF pmb.id != null*/
  　D.ID = /*pmb.id*/10
    /*END*/
    /*IF pmb.name != null*/
  　AND D.NAME = /*pmb.name*/'総務部'
    /*END*/
  /*END*/
```
```sql:展開後
　WHERE
    D.NAME = '人事部' ★ANDを削除してくれる。
```


## パターン2 (id = null, name = null)
### BEGINコメントなし
```sql:展開前
　WHERE
    /*IF pmb.id != null*/
  　D.ID = /*pmb.id*/10
    /*END*/
    /*IF pmb.name != null*/
  　AND D.NAME = /*pmb.name*/'総務部'
    /*END*/
```
```sql:展開後
　WHERE                  ★構文エラー : 条件式がない
```

### BEGINコメントあり
```sql:展開前
  /*BEGIN*/
　WHERE
    /*IF pmb.id != null*/
  　D.ID = /*pmb.id*/10
    /*END*/
    /*IF pmb.name != null*/
  　AND D.NAME = /*pmb.name*/'総務部'
    /*END*/
  /*END*/
```
```sql:展開後
                 　　★WHERE句を削除してくれる。
```

# スペースについて
```sql
  -- 単純コメント : コメント前後に空白を入れる。
  /* ブロックコメント */

  -- バインド変数コメント : 空白はダメ。(Sql2Entity実行時エラー。)
  /*pmb.name*/''

  -- 条件コメント : 空白はダメ。(実行時構文エラーになる。)
  /*IF*/
  /*END*/
  /*BEGIN*/
```

#参考サイト
公式サイト
http://dbflute.seasar.org/ja/manual/function/ormapper/outsidesql/pmcomment.html#endcomment