メインコンテンツまでスキップ
バージョン: 20 R7 BETA

QUERY BY SQL

QUERY BY SQL ( {aTable ;} sqlFormula )

引数説明
aTableTableレコードセレクションを返すテーブル、または 省略された場合デフォルトテーブル
sqlFormulaTextSELECTクエリのWHERE節を表す 有効なSQL検索フォーミュラ

このコマンドはスレッドセーフではないため、プリエンプティブなコードには使えません。

説明

4Dに統合されたSQLカーネルのメリットを利用ためにQUERY BY SQLコマンドを使用できます。このコマンドで以下のような簡単なSELECTクエリを実行できます:

   SELECT *      FROM aTable      WHERE 

aTableは、最初の引数に渡されるテーブルの名前です。sqlFormulaは、2番目の引数で渡されるクエリの文字列です。

例えば、以下のステートメントは、

 ([Employees];"name=’smith’")

以下のSQLクエリに相当します。

   SELECT * FROM Employees WHERE "name=’smith’"

QUERY BY SQL コマンドは、QUERY BY FORMULA コマンドと類似しています。指定されたテーブルでレコードを探します。このコマンドは、カレントプロセスのaTableのカレントセレクションを変更し、新しいセレクションの最初のレコードをカレントレコードにします。

Note: QUERY BY SQL コマンドは、外部SQL接続のコンテクストでは使用されません。このリクエストは4Dの統合されたSQLエンジンに直接接続します。

QUERY BY SQLは、テーブルセレクションの各レコードにsqlFormulaを適用します。sqlFormulaはブール式で、TrueまたはFalseを返さなければなりません。SQL標準では、検索条件はTrueFalseまたはNULLを返します。検索条件がTrueを返す全てのレコード (行) が、新しいカレントセレクションに含まれます。

例えば、値とフィールド (カラム) と比較する場合、sqlFormula式は単純です。しかし演算などを実行したりすると、sqlFormulaの式は複雑になります。QUERY BY FORMULAのように、QUERY BY SQLはリレートするテーブルの情報を評価できます (例題4を参照)。sqlFormulaは有効なSQLステートメントでなければなりません。そしてそのステートメントは4Dの現在のSQLの実行規則の点においてSQL-2スタンダードに準じていなければなりません。4DのSQLのサポートについては、4D SQL Referenceマニュアルを参照してください。

sqlFormula引数は、4D式への参照を使用できます。使用できるシンタックスは、統合SQLコマンドやBegin SQL/End SQLタグの間に挿入されるコード (<>または:MyVar) と同じです。詳細は、SQLコマンドの概要の節を参照してください。

注: このコマンドは、SET QUERY LIMITSET QUERY DESTINATIONコマンドと互換です。

注: コンパイルモードではローカル変数への参照を使用することはできません。4DにおけるSQLプログラミングの情報はSQLコマンドの概要を参照してください。

リレーションについて

4Dのストラクチャエディタで定義されたテーブル間で、QUERY BY SQLはリレーションを使用しません。関連するデータを利用したい場合、クエリへJOINを追加する必要があります。例えば、[Persons]Cityから[Cities]Nameの間に、N対1リレーションを持つ以下のストラクチャがあると仮定します:

   [People]      Name      City   [Cities]      Name      Population

QUERY BY FORMULAコマンドを使用して、以下のように記述できます:

 QUERY BY FORMULA([People];[Cities]Population>1000)

QUERY BY SQLを使用して、リレーションの存在の有無に関わらず、以下のステートメントを記述できます:

 QUERY BY SQL([People];"people.city=cities.name AND cities.population>1000")

Note: QUERY BY SQLは、QUERY BY FORMULAと異なる方法で、1対NとN対Nリレーションを扱います。

例題 1

売上高が100を超えるオフィスを表示します。SQLは以下のようになります:

   SELECT *      FROM Offices      WHERE Sales > 100

QUERY BY SQL コマンドを使用すると、

 C_STRING(30;$queryFormula)
 $queryFormula:="Sales > 100"
 QUERY BY SQL([Offices];$queryFormula)

例題 2

3000から4000件の範囲に分類される注文を表示します。SQLは以下のようになります:

   SELECT *      FROM Orders      WHERE Amount BETWEEN 3000 AND 4000

QUERY BY SQL コマンドを使用すると、

 C_STRING(40;$queryFormula)
 $queryFormula:="Amount BETWEEN 3000 AND 4000"
 QUERY BY SQL([Orders];$queryFormula)

例題 3

指定された条件で並び替えされたクエリ結果の取得方法を説明します。SQLは以下のようになります:

   SELECT *      FROM People      WHERE City =’Paris’         ORDER BY Name

QUERY BY SQL コマンドを使用すると、

 C_STRING(40;$queryFormula)
 $queryFormula:="City= ‘Paris’ ORDER BY Name"
 QUERY BY SQL([People];$queryFormula)

例題 4

4Dのリレートテーブルを使用するクエリをこの例で示します。SQLでは、JOINを使用してリレーションを表わします。以下の2つのテーブルがあると仮定します:

   [Invoices] :      ID_Inv: Longint      Date_Inv: Date      Amount: Real   [Lines_Invoices] :      ID_Line: Longint      ID_Inv: Longint      Code: Alpha (10)

[Lines_Invoices]ID_Invから[Invoices]ID_Invの間に、N対1のリレーションがあります。
QUERY BY FORMULAコマンドでストラクチャのリレーションを使用する場合、以下のように記述します:

 QUERY BY FORMULA([Lines_Invoices];([Lines_Invoices]Code="FX-200") & (Month of([Invoices]Date_Inv)=4))

これをSQLクエリで表すと以下のようになります:

   SELECT ID_Line      FROM Lines_Invoices, Invoices      WHERE Lines_Invoices.ID_Inv=Invoices.ID_Inv         AND Lines_Invoices.Code='FX-200'         AND MONTH(Invoices.Date_Inv) = 4

QUERY BY SQL コマンドを使用する場合:

 C_STRING(40;$queryFormula)
 $queryFormula:="Lines_Invoices.ID_Inv=Invoices.ID_InvAND Lines_Invoices.Code=’FX-200’ AND MONTH(Invoices.Date_Inv)=4"
 QUERY BY SQL([Lines_Invoices];$queryFormula)

システム変数およびセット

検索条件のフォーマットが正しければ、OKシステム変数は1に設定されます。そうでなければこのコマンドの結果のセレクションは空になり、エラーが返され、OK変数の値は0に設定されます。このエラーはON ERR CALLコマンドでインストールされるエラー処理メソッドでとらえることができます。

参照

QUERY BY FORMULA