スクリプトでのテーブルのクエリ

  • リリースバージョン: Xanadu
  • 更新日 2024年08月01日
  • 所要時間:14分
  • GlideRecord API のメソッドを使用すると、テーブルからすべてのレコードを返したり、テーブルから特定の条件を満たすレコードを返したり、テキストインデックスグループ内の単一のテーブルまたは複数のテーブルから文字列を含むレコードを返したりできます。

    GlideRecord API を使用してテーブルにクエリを実行します。API リファレンスについては、「GlideRecord - スコープ対象」を参照してください。

    テーブルからすべてのレコードを返す

    テーブルにクエリを実行するには、最初に GlideRecord オブジェクトを作成します。GlideRecord を作成するには、スクリプトで次を作成します。
    var target = new GlideRecord('incident');

    GlideRecord を作成すると、インシデントテーブルの GlideRecord オブジェクトである target 変数が作成されます。

    インシデントテーブルのすべてのレコードを処理するには、次のスクリプトを追加します。
    target.query(); // Issue the query to the database to get all records 
    while (target.next()) { 
      // add code here to process the incident record 
    }

    このスクリプトは、データベースに query() を発行します。next() を呼び出すたびに、処理のために次のレコードがロードされます。

    クエリ条件を満たすテーブルからレコードを返す

    ほとんどの場合、特定のレコードまたは特定のレコードのセットを取得する必要があり、取得するレコードを定義するいくつかの基準 (クエリ条件) があります。たとえば、優先度の値が 1 のすべてのインシデントレコードを取得する必要があるとします。これを実行するコードを次に示します。
    var target = new GlideRecord('incident'); 
    target.addQuery('priority',1);
    target.query(); // Issue the query to the database to get relevant records 
    while (target.next()) { 
      // add code here to process the incident record 
    }
    サンプルスクリプトに target.addQuery('priority', 1); が含まれていることに注目してください。この行は、priority フィールドが 1 に等しいレコードのみを要求していることを示しています。一般に、実行するクエリのほとんどは等価クエリです。つまり指定した値と等しいフィールドを持つレコードを検索するクエリです。そのため、等価演算子を指定する必要はありません。ただし、たとえば priority フィールドが 1 より大きいすべてのインシデントを検索するとします。この場合には、クエリに適用する演算子を指定します。
    var target = new GlideRecord('incident') ; 
    target.addQuery('priority','>',1);
    target.query(); // Issue the query to the database to get relevant records 
    while (target.next()) { 
      // add code here to process the incident record 
    }

    テーブルから文字列を含むレコードを返す

    予約名 '123TEXTQUERY321' を使用して、テーブルのすべてのフィールドで一致する文字列を検索します。たとえば、このスクリプトは、文字列 'email' を含むフィールド値を持つレコードをインシデントテーブルから返します。

    var now_GR = new GlideRecord('incident');
    gr.addQuery('123TEXTQUERY321', 'email');
    gr.query();

    '123TEXTQUERY321' は、addQuery() メソッドの name パラメーターの予約済みオプションです。このオプションは、エンコードされたクエリ文字列で使用できます。たとえば、gr.addQuery('123TEXTQUERY321', 'email'); の代わりに、gr.addEncodedQuery('123TEXTQUERY321=email') を使用できます。

    文字列の検索では大文字と小文字が区別されません。emailEmail、または EMAIL のいずれを検索しても、同じ結果が返されます。

    注:
    文字列検索を使用してクエリを実行する前に、検索するテーブルのテキストインデックス作成 (およびオプションで検索属性) を構成する必要があります。詳細については、「インデックス作成と検索のための単一のテーブルの構成」を参照してください。

    テキストインデックスグループの複数のテーブルから文字列を含むレコードを返す

    テキストインデックスグループのテーブル内の文字列を検索するには、'123TEXTINDEXGROUP321' 予約名を使用します。このオプションは、テキストインデックスグループの設定を使用して計算された関連性スコアの結果を返します。

    注:
    テキストインデックスグループで一度にクエリできるテーブルは 1 つだけです。複数の単一テーブルクエリを発行して結果を結合し、関連性スコアで並べ替える場合は、このオプションを使用します。このオプションの利点は、個々のテーブルクエリの検索結果の関連性スコアが、テキストインデックスグループ内のすべてのテーブルで一貫して正規化されることです。
    たとえば、このスクリプトは、「portal」インデックスグループに対して計算された関連性スコアと、キーワード「email」を含むレコードをナレッジテーブルから返します。
    var now_GR = new GlideRecord('kb_knowledge');
    gr.addQuery('123TEXTQUERY321', 'email');
    gr.addQuery('123TEXTINDEXGROUP321', 'portal');
    gr.query();

    検索する「ポータル」インデックスグループ内の追加のテーブルごとに同様のクエリを作成し、個々のクエリの結果を結合して、関連性スコアが最も高い結果を最初に表示することができます。これらの検索クエリはすべて同じテキストインデックスグループ検索設定を使用するため、結果の関連性スコアはすべて一貫して正規化されます。gr.addQuery('123TEXTINDEXGROUP321', 'portal') メソッドを使用せずに同じテーブルセットを検索した場合、個々のクエリの関連性スコアは異なる方法で正規化され、結合された結果セットをソートするための基準として役立ちません。

    '123TEXTINDEXGROUP321' は、addQuery() メソッドの name パラメーターの予約済みオプションです。このオプションは、エンコードされたクエリ文字列で使用できます。たとえば、gr.addQuery('123TEXTINDEXGROUP321', 'portal'); の代わりに、gr.addEncodedQuery('123TEXTINDEXGROUP321=portal') を使用できます。

    複数のテーブルの文字列の検索では大文字と小文字が区別されません。emailEmail、または EMAIL のいずれを検索しても、同じ結果が返されます。

    注:
    インデックスグループ内のテーブルをクエリする前に、それらのテーブルのテキストインデックス作成と検索属性を構成し、インデックスグループにそれらを含める必要があります。詳細については、「インデックス作成と検索用の複数のテーブルの構成」を参照してください。インデックスグループ内のすべてのテーブルは、V4 インデックス形式を使用する必要があります。

    使用可能な JavaScript 演算子

    addQuery() 要求内で使用できる演算子について説明します。

    表 : 1. 使用可能な JavaScript 演算子
    フィールド 定義 addQuery
    = フィールドは、指定された値と等しい必要があります。 addQuery('priority', '=', 1);
    > フィールドは、指定された値より大きい必要があります。 addQuery('priority', '>', 1);
    < フィールドは、指定された値より小さい必要があります。 addQuery('priority', '<', 3);
    >= フィールドは、指定された値以上である必要があります。 addQuery('priority', '>=', 1);
    <= フィールドは、指定された値以下である必要があります。 addQuery('priority', '<=', 3);
    != フィールドは、指定された値と等しくなっていない必要があります。 addQuery('priority', '!=', 1);
    STARTSWITH フィールドは、指定された値で始まる必要があります。右側の例は、short_description フィールドが「Error」というテキストで始まるすべてのレコードを返します。 addQuery('short_description', 'STARTSWITH', 'Error');
    CONTAINS フィールドは、テキストのどこかに、指定された値が含まれている必要があります。右側の例では、short_description フィールド内のどこかに「Error」というテキストが含まれているすべてのレコードが返されます。
    注:
    LIKE 演算はサポートされていません。アドミニストレーターは、クエリで CONTAINS を使用する必要があります。
    addQuery('short_description', 'CONTAINS', 'Error');
    IN カンマを許可する値のマップを取得し、他の要件を満たすレコードのコレクションを収集します。Select * from <table> where short_description IN ('Error', 'Success', 'Failure') と同じように動作します。これは Select * from <table> where short_description='Error' と同じです。たとえば、特定のアクティビティに属するすべての変数値のクエリを実行するには、IN 節を使用して、その sys_id をマップまたはカンマ区切りリストに格納します。次に、変数値テーブルにクエリを実行し、この sys_id のリストを指定します。 addQuery('short_description', 'IN', 'Error,Success,Failure');
    ENDSWITH フィールドは、指定された値で終了する必要があります。右側の例では、short_description フィールドが「Error」というテキストで終わるすべてのレコードを返します。 addQuery('short_description', 'ENDSWITH', 'Error');
    DOES NOT CONTAIN フィールドのパターンに一致しないレコードを選択します。この演算子は空のフィールドを取得しません。空の値の場合は、「is empty」または「is not empty」という演算子を使用します。右側の例では、short_description フィールドに「Error」という語が含まれていないすべてのレコードが返されます。 addQuery('short_description', 'DOES NOT CONTAIN', 'Error');
    NOT IN カンマを許可する値のマップを取得し、他の要件を満たすレコードのコレクションを収集します。次と同じように動作します。Select * from <table> where short_description NOT IN ('Error') addQuery('short_description', 'NOT IN', 'Error,Success,Failure');
    INSTANCEOF 拡張テーブルの指定された「クラス」のレコードのみを取得する特殊な演算子。右側のコード例は、コンピューターとして分類されているすべての構成アイテムを取得する方法を示しています。 addQuery('sys_class_name', 'INSTANCEOF', 'cmdb_ci_computer');

    フィルターとクエリに使用できる演算子の詳細については、「Operators available for filters and queries」を参照してください。

    NULL または NOT NULL のデータを検索するために使用できる特殊なメソッドもあります。short_description フィールドが指定されていない (null である) すべてのインシデントを検索するには、次のクエリを使用します。
    var target = new GlideRecord('incident'); 
    target.addNullQuery('short_description');
    target.query(); // Issue the query to the database to get all records 
    while (target.next()) { 
      // add code here to process the incident record 
    }
    short_description が指定されているすべてのインシデントを検索するには、次のクエリを使用します。
    var target = new GlideRecord('incident'); 
    target.addNotNullQuery('short_description');
    target.query(); // Issue the query to the database to get all records 
    while (target.next()) { 
      // add code here to process the incident record 
    }

    GlideRecord API とその使用可能なメソッドの詳細については、「GlideRecord」を参照してください。

    GlideRecord クエリの例

    これらの例は、さまざまな GlideRecord クエリを実行する方法を示しています。

    クエリ

    var rec = new GlideRecord('incident');
    rec.query(); 
    while(rec.next()) { 
      gs.print(rec.number + ' exists'); }

    update

    var rec = new GlideRecord('incident');
    rec.addQuery('active',true);
    rec.query(); 
    while(rec.next()) { 
      rec.active = false;
      gs.print('Active incident ' + rec.number = ' closed');
      rec.update(); }

    insert

    var rec = new GlideRecord('incident');
    rec.initialize();
    rec.short_description = 'Network problem'; 
    rec.caller_id.setDisplayValue('Joe Employee'); 
    rec.insert();

    delete

    var rec = new GlideRecord('incident');
    rec.addQuery('active',false);
    rec.query(); 
    while(rec.next()) { 
      gs.print('Inactive incident ' + rec.number + ' deleted');
      rec.deleteRecord(); }

    サービスカタログテーブルのクエリ

    サービスカタログ要求アイテムテーブル [sc_req_item] の変数について直接クエリを実行することはできません。代わりに、変数名用と値用の 2 つのクエリを追加して、変数所有権テーブル [sc_item_option_mtom] にクエリを実行します。クエリは、要求アイテムにドット連結することができる多対多の関係を返します。次の例では、変数 item_name がありその値が item_value である要求アイテムを検索し、要求アイテム番号を表示します。
    var now_GR = new GlideRecord('sc_item_option_mtom');
    gr.addQuery('sc_item_option.item_option_new.name','item_name');
    gr.addQuery('sc_item_option.value','item_value');
    gr.query();
     
    while(gr.next()) {
      gs.addInfoMessage(gr.request_item.number); }

    詳細については、「GlideRecord」を参照してください。