クリック画像の実寸表示

段ボール箱を机にした猫 ファイルメーカー(filemaker)のちらしの裏のメモ書き

TOP  >  ExecuteSQL関数の使い方
作成日:2024年09月09日

ExecuteSQL関数の使い方

イメージイラスト
にゃん太

どうも、にゃん太です

ファイルメーカーで開発を進めている時、たまにSQL構文が使えたらと思う事があります

大丈夫、SELECT文に限りますが、ExecuteSQL関数を使用する事で対応可能です

今回のメモでは、ExecuteSQL関数の使用例を書いていきます


ExecuteSQL関数
まずはExecuteSQL関数について、重要な点をマニュアルから抜粋して見てみましょう

構文

ExecuteSQL ( SQL クエリー ; フィールド区切り ; 行区切り { ; 引数...} )

引数

SQL クエリー - SQL SELECT ステートメント。ステートメントには、2 つのクエリーの結果を組み合わせた Union 句を含むことができます。ステートメントには、オプションの引数がクエリーのどこで使用されるかを示す、プログラムに基づいて生成された SQL (ダイナミック引数) を含むことができます。ダイナミック引数を指定する場合は疑問符 (?) を使用します。

フィールド区切り - 計算結果のフィールド間の区切りとして使用される文字列。空の文字列が指定されると、区切りはコンマになります。フィールド区切りは、計算結果の最終フィールドの後には表示されません。

行区切り - 計算結果の中のレコード間の区切りとして使用される文字列。空の文字列が指定されると、区切りは改行になります。行区切りは、計算結果の最終行の後には表示されません。

引数- クエリーステートメントのダイナミック引数の値として評価、使用される式。

メモ
  • SQL クエリーに適切な日付書式を適用するには、DATE ステートメントを使用します。DATE ステートメントを使用しないと、ExecuteSQL では、日付がリテラル文字列として処理されます。
  • FileMaker Pro は、オペレーティングシステムやファイルのロケールではなく、Unicode/SQL 形式で日時や数字データを返します。
  • ExecuteSQL では、カッコのない SQL-92 構文 ISO 日付および時刻書式のみを使用できます。ExecuteSQL では、ODBC/JDBC 書式のカッコ付きの日付、時刻、タイムスタンプ定数は使用できません。
  • FileMaker SQL は、Unicode バイナリソート順を使用します。これは言語のソートやデフォルトの言語のニュートラルなソート順で使用される FileMaker Pro のソート順とは異なります。
  • SELECT ステートメントの構文、サポートされる SQL ステートメント、式、およびカタログ関数については、『FileMaker ODBC と JDBC ガイド』および『FileMaker SQL リファレンス』を参照してください。

ExecuteSQL関数の使用で気を付ける事
まず、SELECT構文しか使用できませんので、INSERTやDELETEなどのデータを加工する処理は行えません
それから、日本語名のテーブルやフィールドも使用できますが、「\"」で囲む必要があります

ExecuteSQL関数の使用例
とりあえず、下図の様なテーブルがある事を前提に使用例を挙げていきます
尚、データは「学生個人情報ジェネレータ」で作成したダミーデータを使用しています
生徒名簿テーブル 成績テーブル
テーブルの全てのレコード、フィールドの値を取得する

計算式

ExecuteSQL ( "SELECT * FROM \"生徒名簿\""; ""; "" )
取得結果

テーブルの指定したフィールドの値だけを取得する

計算式

ExecuteSQL ( "SELECT \"生徒番号\",\"姓\",\"名\" FROM \"生徒名簿\""; ""; "" )
取得結果

条件に合致するレコードだけを取得する

計算式

ExecuteSQL ( "SELECT * FROM \"生徒名簿\" WHERE \"生徒番号\"='240001'"; ""; "" )
取得結果

条件に部分一致するレコードだけを取得する

スクリプト

フィールド設定 [結果表示::結果; ExecuteSQL ( "SELECT * FROM \"生徒名簿\" WHERE \"生徒番号\" LIKE '24000%'"; ""; "" )]
取得結果

複数テーブルをJOINで結合して取得する

計算式

ExecuteSQL ( "SELECT M.\"生徒番号\",M.\"姓\",M.\"名\",S.\"科目\",S.\"点数\" FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" WHERE S.\"科目\"='国語'"; ""; "" )
取得結果

国語の点数の合計値を取得する

計算式

ExecuteSQL ( "SELECT SUM(S.\"点数\") FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" WHERE S.\"科目\"='国語'"; ""; "" )
取得結果

国語の点数の平均値を取得する

計算式

ExecuteSQL ( "SELECT AVG(S.\"点数\") FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" WHERE S.\"科目\"='国語'"; ""; "" )
取得結果

科目ごとの合計値、平均値を取得する

計算式

ExecuteSQL ( "SELECT S.\"科目\",SUM(S.\"点数\"),AVG(S.\"点数\") FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" GROUP BY S.\"科目\""; ""; "" )
取得結果

生徒ごとの全科目の合計点数を取得する

計算式

ExecuteSQL ( "SELECT M.\"生徒番号\",SUM(S.\"点数\") FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" GROUP BY M.\"生徒番号\""; ""; "" )
取得結果

国語の点数が平均点以上の生徒を取得

計算式

ExecuteSQL ( "SELECT M.\"生徒番号\",M.\"姓\",M.\"名\",S.\"科目\",S.\"点数\" FROM \"生徒名簿\" AS M JOIN \"成績\" AS S ON M.\"生徒番号\" = S.\"生徒番号\" WHERE S.\"科目\"='国語' AND S.\"点数\" >= (SELECT AVG(\"点数\") FROM \"成績\" WHERE \"科目\"='国語')"; ""; "" )
取得結果

誕生日が8月の生徒を取得する

計算式

ExecuteSQL ( "SELECT \"生徒番号\",\"姓\",\"名\",\"生年月日\" FROM \"生徒名簿\" WHERE \"生年月日\" >= '" & Date ( 8; 1; 2011 ) & "' AND \"生年月日\" <= '" & Date ( 8; 31; 2011 ) & "'"; ""; "" )
取得結果

何となく使いそうな条件を設定してみましたが、問題なく動作する様です

メモ書き終了の案内イラスト

以上で今日のメモ書きは終了です

内容はいかがでしたか?

もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください

ご連絡フォーム