QUERY BY FORMULA
QUERY BY FORMULA ( aTable {; queryFormula} )
引数 | 型 | 説明 | |
---|---|---|---|
aTable | Table | → | レコードセレクションを求めるテーブル |
queryFormula | Boolean | → | 検索フォーミュラ |
説明
QUERY BY FORMULAはaTableからレコードを検索します。QUERY BY FORMULAは、カレントプロセスのaTableのカレントセレクションを変更し、セレクションの先頭のレコ-ドをカレントレコ-ドにします。
QUERY BY FORMULAとQUERY SELECTION BY FORMULAは、全く同じように機能しますが、QUERY BY FORMULAがテーブルのすべてのレコードを検索対象とするのに対して、QUERY SELECTION BY FORMULAコマンドはカレントセレクションのレコードのみを検索対象とします。
両方のコマンドは、テーブルまたはセレクションの各レコードに対してqueryFormulaを適用します。queryFormulaはTRUEかFALSEのいずれかの状態に評価されるブール式です。queryFormulaでTRUEに評価されたレコードを新しいセレクションに追加します。
queryFormulaは、フィールドと値とを比較するだけの単純なものから、計算、またはリレート先テーブルの情報を評価するような複雑なものまで処理します。queryFormulaには4Dの関数 (コマンド) や開発者が作成した関数 (メソッド) や式 (フォーミュラ) を使用することができます。文字フィールドやテキストフィールドに対して作業を実行する場合は、queryFormulaにワイルドカード (@) を使用することもできます。詳しい情報はQUERYコマンドの例を参照してください。
警告: 引数($1...$n) はqueryFormula ではサポートされていません。
queryFormulaが省略されると、4Dはフォーミュラでクエリダイアログボックスを表示します(ユーザーは**[+]ボタン上をAlt+クリック**することでフォーミュラに新しい行を追加することができます)。
検索が完了すると、新しいセレクションの最初のレコードがディスクからロードされカレントレコードになります。
これらのコマンドは最適化され、特にインデックスを利用します。クエリのタイプが許す場合、これらのコマンドはQUERYコマンドと同じのクエリを実行します。例えば
QUERY BY FORMULA([mytable]; [mytable]myfield=value)
は可能であればインデックスを使用し、
QUERY([mytable]; [mytable]myfield=value)
と同じに実行されます。4Dは最適化可能な部分を先に検索し、他の残りのクエリと合算することで、部分的に最適化できないクエリも最適化します。例えば、
QUERY BY FORMULA([mytable];Length(myfield)=value)
は最適化されません。他方、
QUERY BY FORMULA([mytable];Length(myfield)=value1 | myfield=value2)
は部分的に最適化されます。
これらのコマンドは、異なるテーブルのフィールドを比較する場合、SQL のような"JOIN"を行います。これはつまりテーブル間に自動リレーションが必要ない事を意味します。たとえば、以下のようなステートメントを実行する事が可能です(例題3を参照)
QUERY BY FORMULA([Table_A];([Table_A]field_X = [Table_B]field_Y) & ([Table_B]field_Y = "abc"))
フォーミュラの前半([Table_A]field_X = [Table_B]field_Y) は二つのフィールド間でのJOINを確立し、後半の([Table_B]field_Y = "abc") は検索条件を定義します。この際、以下の条件が適用されます:
- 少なくとも一つの検索条件が設定される必要があります。
- queryFormula 引数には、同じテーブルに対しては一つまでしかフィールド比較演算子を含めることができません。
テーブル間のリレーションが存在しても、それらはルールとしては使用されません。しかし以下のケースでは、これらのコマンドは自動リ レーションを使用します:
- フォーミュラが { フィールド ; 比較演算子; 値} の形式の要素に分解できない場合
- 同じテーブルの2つのフィールドが比較されている場合
**互換性に関する注意: v11 以前のバージョンから返還されたデータベースとの互換性のため、JOINメカニズムを無効にできます。これにはSET DATABASE PARAMETERコマンドのセレクターを使用します。
4D Server: このコマンドはサーバ上で実行され、実行が最適化されるようになりました。queryFormula内で直接変数が呼ばれているとき、クライアントマシンの変数値を使用してクエリを計算します。例えばQUERY BY FORMULA([mytable];[mytable]myfield=myvariable)というステートメントはサーバ上で実行されますが、myvariable変数の内容はクライアントマシンのものが使用されます。
互換性に関する注意: 4D Server v11までは、このコマンドはクライアントマシン上で実行されていました。後方互換性のために、この振る舞いは変換されたデータベースでは維持されています。しかしながら、互換性プロパティ、あるいはSET DATABASE PARAMETER コマンドのセレクターを使用することで、変換されたデータベースでもサーバー側での実行が有効化されます。
例題 1
以下の例は、すべての年の12月に作成された請求書のレコードを検索します。これはMonth of関数を各レコードに適用して検索します。このような検索は月の情報を別のフィールドとして持たない限り、他の方法では実現できません:
QUERY BY FORMULA([Invoice];Month of([Invoice]Entered)=12) // Find the invoices entered in December
例題 2
以下の例は、名前が10文字を超える人のレコードを検索します:
QUERY BY FORMULA([People];Length([People]Name)>10) // Find names longer than ten characters
例題 3
この例題では、テーブルにリレーションがありませんが、"ACME" クライアントからの請求書の全ての行をクエリするのにJOIN を使用する場合を考えます:
QUERY BY FORMULA([invoice_line];([invoice_line]invoice_id=[invoice]id&[invoice]client="ACME"))
参照
QUERY
QUERY BY SQL
QUERY SELECTION
QUERY SELECTION BY FORMULA