4D v16.3QUERY |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
QUERY
QUERY
QUERY は、aTableに対してqueryArgumentに指定した条件に一致するレコードを検索し、検索結果をセレクションとして返します。QUERYは、カレントプロセスのaTableのカレントセレクションを変更し、セレクションの先頭のレコ-ドをカレントレコ-ドにします。 aTable引数を省略した場合、コマンドはデフォルトテーブルに対して適用されます。デフォルトテーブルが設定されていない場合には、エラーが発生します。 queryArgumentまたは * を指定しない場合、QUERYはaTable 用のクエリエディタを表示します (複数クエリの最後の行である場合を除く、例題 2参照): クエリエディタについての詳細は4D Design Referenceマニュアルを参照してください。 ユーザはクエリを作成し、クエリボタンをクリックするか、絞り込みクエリボタンをクリックして検索を実行します。検索が中断されずに実行された場合、システム変数OKには1が代入されます。ユーザが「キャンセル」をクリックするか、QUERYコマンドが中断されて実際には検索が行われなかった場合には、システム変数OKに0が代入されます。 以下の例は、[Products]テーブルに対するクエリエディタを表示します: QUERY([Products]) 以下の例は、デフォルトテーブル (設定されている場合) に対するクエリエディタを表示します: QUERY queryArgument引数を指定すると、標準のクエリエディタは表示されず、クエリはプログラムから定義されます。単一クエリの場合 (1つのフィールドだけを検索)、queryArgumentをもとにQUERYコマンドを1回コールします。複合検索の場合 (複数フィールドに対する検索、または複合条件による検索)、queryArgumentを用いて必要な回数だけQUERYコマンドをコールします。そして、最後のQUERYコマンドのコール以外のQUERYコマンドに対してオプション引数 * を指定します。* を含まない最後のコールの後、実際の検索処理が実行されます。引数queryArgumentについては、この節で更に詳しく説明します。 以下の例は、[People]テーブルの名前が“a”で始まる人のレコードを検索します: QUERY([People];[People]Last name="a@") 以下の例は、[People]テーブルの名字フィールドが“a”または“b”で始まる人のレコードを検索します: QUERY([People];[People]Name="a@";*) // * は追加の検索条件があることを示します 注: @ 文字の解釈ルールは環境設定で変更できます。詳細は比較演算子を参照してください。 queryArgument 引数には以下のシンタックスを指定できます: { 論理演算子 ; } フィールド 比較演算子 値 論理演算子はQUERY呼び出しを結合するために使用します。使用できる論理演算子はクエリエディタで使用できるものと同じです:
論理演算子はオプションで、複合検索の最初のQUERYコマンドおよびQUERYコマンドが1つしかない場合には使用されません。複合検索クエリで論理演算子を省略した場合、デフォルトでAND (&) が使用されます。 fieldは検索対象となるフィールドです。aTableが1テーブルへの自動リレートまたはマニュアルリレートを持つ場合、fieldはリレート先の1テーブルのフィールドも使用可能です。比較演算子はフィールドと値とを比較するために使用します。比較演算子を次に示します:
Note: 比較演算子を記号ではなく文字式でも指定できます。この場合、クエリ文字列の項目を区切るためにセミコロンを使用しなければなりません。この方法を使用すれば、例えばカスタムクエリのユーザインタフェースを作成することができます。例題 21を参照してください。 値はフィールドと比較するためのデータです。値は、評価結果がフィールドと同じデータタイプである式です。値は検索の初めに一度だけ評価されます。各レコードに対して評価されるわけではありません。文字列中に特定の文字列を含んでいるかどうかを検索する場合 (包含検索) には、値にワイルドカード記号 (@) を使用することができます。 キーワードによる検索は文字やテキスト型のフィールドに対してのみ可能です。このタイプのクエリに関する詳細は比較演算子を参照してください。 複合条件検索を実行するための規則を次に示します:
注: 作成したカレントクエリは各テーブル毎に管理されます。つまり各テーブルに1つの複合検索を同時に作成できます。aTable引数を指定するかデフォルトテーブルを指定することで、検索対象テーブルを明確に特定する必要があります。 検索の定義方法に関係なく、以下の処理が行われます:
以下の例は、Smithという名の人のレコードをすべて検索します: QUERY([People];[People]Last Name="Smith") Note: Last Nameのフィールドにインデックスが設定されている場合、QUERYコマンドは高速な検索のために、自動的にインデックスを使用します。 Reminder: この検索では、“Smith”、“smith”、“SMITH”等のレコードを検索します。大文字と小文字を区別するには、文字コードを使用した検索を行ってください。 以下の例はJohn Smithという名前の人のレコードをすべて検索します。Last Nameのフィールドにはインデックスが設定されていますが、First Nameのフィールドにはインデックスが設定されていません。 QUERY([People];[People]Last Name="smith";*) ` Find every person named Smith 検索を実行すると、まず最初にインデックスを持ったLast Nameのフィールドを検索し、Smithという名前の人のレコードのみに検索対象を絞ります。次に、このレコードセレクションの中からFirst Nameのフィールドに対してシーケンシャルな検索を行います。 Note: このクエリはデータベースに[People]Last Name+[People]First Nameの複合インデックスが設定されていると特に最適化されます。この場合コマンドはインデックスを使用できます。 以下の例では、[People]First Name+[People]Last Name フィールド(あれば)の複合インデックスの利点を自動的に用いて、John Smithという名前の人間のレコードを全て検索します。 QUERY([People];[People]First Name="john";*) ` Johnという名前の人間を全て探す 詳細な情報については、複合インデックス を参照してください。 以下の例はSmithまたはJonesという名字の人のレコードをすべて検索します。名字 (Last Name) のフィールドにはインデックスが設定されています。 QUERY([People];[People]Last Name="smith";*) ` Find every person named Smith… QUERYコマンドは両方の検索にLast Nameインデックスを使用します。2つの検索が実行され、その結果が内部セットに納められて、結合されます。 以下の例は、会社名が設定されていないレコードをすべて検索します。これは空のフィールド(空の文字列)を検索することによって行います。 QUERY([People];[People]Company="") ` Find every person with no company 以下の例は、Smithという名字でNew Yorkに会社のある人のレコードをすべて検索します。2番目のQUERYコマンドは、他のテーブルのフィールドを使用しています。これは、[People]テーブルから[Company]テーブルへN対1リレートされているために可能になっています: QUERY([People];[People]Last Name="smith";*) ` Find every person named Smith… 以下の例は、名前のイニシャルがAからMの人のレコードをすべて検索します: QUERY([People];[People]Name<"n") ` Find every person from A to M 以下の例は、郵便番号がが“94” (サンフランシスコ) または“90” (ロサンゼルス) の人のレコードをすべて検索します: QUERY([People];[People]ZIP Code ="94@";*) ` Find every person in the SF… キーワードによる検索: 以下の例題は[Products] テーブルのdescriptionフィールドに単語“easy”が含まれるレコードを検索します: QUERY([Products];[Products]description%"easy") 以下の例題は、リクエストダイアログに入力したインボイス参照と等しい請求書を検索します: vFind:=Request("Find invoice reference:") ` Get an invoice reference from the user 以下の例は、1996年に作成された請求書のレコードをすべて検索します。これは、1995年12月31日よりあとで1997年1月1日より前のレコードをすべて検索します: QUERY([Invoice];[Invoice]In>!12/31/95!;*) ` Find invoices after 12/31/95… 以下の例は、給与が$10,000以上で、$50,000未満の条件に当てはまる従業員のレコードをすべて検索します: QUERY([Employee];[Employee]Salary >=10000;*) ` Find employees who make between… 以下の例は、$20,000以上の給与を得ているマーケティング部に所属する従業員のレコードをすべて検索します。Salaryフィールドにはインデックスが設定されているため最初に検索されます。2番目のQUERYコマンドが、他のテーブルのフィールドを使用している点に注意してください。[Employee]テーブルから[Dept]テーブルへn対1の自動リレートが設定されているためにこのようなことが可能になっています: QUERY([Employee];[Employee]Salary >20000;*) ` Find employees with salaries over $20,000 and... N対1でリレートされた3つのテーブルがあります: [City] -> [Department] -> [Region]。以下のクエリは市の名前が"Saint"で始まるRegionを検索します: QUERY([Region];[City]Name="Saint@") ` Find all the regions with cities beginning with "Saint" 以下はmyVar変数の値を使用して情報を検索します。 QUERY([Laws];[Laws]Text =myVar) ` Find all laws that match myVar myVarの値により、クエリは様々な結果になります。例えば:
以下の例題では、変数の値に基づき複合クエリを組み立てます。この方法で、有効な条件のみを検索に使用することができます: QUERY([Invoice];[Invoice]Paid=False;*) この例題では比較演算子に文字式を使用する方法を示します。比較演算子はポップアップメニューでカスタムクエリダイアログボックスに置かれています: C_TEXT($oper) ピクチャーフィールドのキーワードインデックスを使用すると、アプリケーションの速度を劇的に向上できます。 QUERY([PICTURES];[PICTURES]Photos %"cats") // "cats"キーワードが割り当てられた画像を検索する クエリが正しく実行されると、OKシステム変数が1に設定されます。以下の場合は0に設定されます:
参照
|
プロパティ
プロダクト: 4D 履歴
変更: 4D v11 SQL ARTICLE USAGE
ランゲージリファレンス ( 4D v16) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||