条件式や計算式の記法
演算子や関数を直接記述することで、レコードの検索条件を指定したり、フィールドの格納値を自動で生成することができます。
以下の機能では、条件式を記述することでレコードの検索条件を指定できます。
・APIのクエリパラメータwhere
・アプリ利用画面およびアプリ管理画面の高度な条件設定
・アプリ管理画面のDBトリガレコードアクションの発動条件
以下の機能では、フィールドへ格納する値を自動生成することができます。
・アプリ管理画面のDBトリガレコードアクションの処理マッピング
参照フィールドの指定方法、ユーザフィールドの指定方法、ログインフィルタにおけるフィールド値関係抽出の指定方法 については各見出しをご参照ください。
目次
フィールドの識別子またはフィールドタイプの書式
フィールドの識別子やフィールドタイプの値を式に使用する場合、それぞれ以下の表に従って記載する必要があります。
※一部のフィールドタイプはSPIRAL ver.2の独自関数を使用し、値をフィールドタイプの形式に変換する必要があります。
識別子またはフィールドタイプ | 使用例 | 説明 |
---|---|---|
name(識別子) | @_id |
nameの先頭に@をつけます。 |
text型 | '山田 太郎' 'I''m Yamada Taro' |
シングルクォートで囲みます。 文字列にシングルクォートを含める場合は シングルクォートを連続させてエスケープする必要があります。 |
email型 | 'email@example.com' | シングルクォートで囲みます。 |
phone型 | '+81 80-1111-2222' PHONE('080-1111-2222') |
シングルクォートで囲む場合はE164フォーマットで指定します。 PHONE関数を用いることで、一般的な電話番号の形式の入力も可能です。 |
integer型 | 100 -100 INTEGER('100') |
シングルクォートで囲まずにそのまま入力できます。 INTEGER関数を用いることで、文字列を整数に変換することも可能です。 |
double型 | 100.123 -100.123 |
シングルクォートで囲まずにそのまま入力できます。 |
date型 | '2017-01-01' DATE('2017-01-01') NOW() |
シングルクォートで囲みます。 ※年-月-日(ハイフン区切り年月日順)のフォーマットで記載してください。 ※1桁の場合0は省略可能です。 |
dateTime型 | '2017-01-01T21:00:00+09:00' |
シングルクォートで囲みます。 |
monthDay型 | MONTH_DAY('01-01') |
MONTH_DAY関数を用いて文字列を月日に変換する必要があります。 ※月-日(ハイフン区切り月日順)のフォーマットで記載してください。 ※1桁の場合0は省略可能です。 |
time型 | '12:00:00' | text型と同様シングルクォートで囲みます。 |
select型 | 10 | シングルクォートで囲まずにそのまま入力できます。 |
multiselect 型 | MULTISELECT('0','1') |
MULTISELECT関数を用いて文字列をマルチセレクトに変換する必要があります。 ('0','1')はラベルではなくIDを指定してください。 |
演算子の書式
演算子は以下を指定できます。
演算子 | 説明 | 使用例 |
---|---|---|
= | 一致 | @name = '山田 太郎' |
<> | 不一致 | @name <> '山田 太郎' |
< | 未満 | @age < 10 |
<= | 以下 | @age <= 10 |
> | 超過 | @age > 10 |
>= | 以上 | @age >= 10 |
+ | 加算 | @age > @integer + 10 |
- | 減算 | @age > @integer - 10 |
* | 乗算 | @price > @integer * 10 |
/ | 除算 | @price > @integer / 10 |
% | 剰余算 | @price = @integer % 10 |
IS NULL | NULL検索 | @email IS NULL |
IS NOT NULL | NULL以外の検索 | @email IS NOT NULL |
IN | 指定したリストとの比較 | @name IN ('山田 太郎', '田中 花子', '佐藤 一郎') |
LIKE | 文字列パターンのマッチング(大文字小文字区別)。 ワイルドカードは、%、_ %:任意の0文字以上の文字列 _:任意の1文字 |
@name LIKE '%Taro' @name LIKE 'Yamada _aro' |
ILIKE | 文字列パターンのマッチング(大文字小文字無視)。 ワイルドカードは、%、_ %:任意の0文字以上の文字列 _:任意の1文字 |
@name ILIKE '%taro' |
NOT | 否定。INやLIKE、CONTAINSと組み合わせる |
@name NOT LIKE '%太郎' @name NOT IN ('山田 太郎', '田中 花子') @status NOT ANYCONTAINS ('1', '2') @category NOT ALLCONTAINS ('1', '2') |
AND | 論理積 | @age >= 10 AND @name = '山田 太郎' |
OR | 論理和 | @age >= 10 OR @name = '山田 太郎' |
ANYCONTAINS |
指定の選択肢番号のいずれか含む(セレクト、マルチセレクトフィールドのみ有効) |
@status ANYCONTAINS ('1', '2') |
ALLCONTAINS |
指定の選択肢番号全てが含まれる(マルチセレクトフィールドのみ有効) |
@category ALLCONTAINS ('1', '2') |
|| |
文字列連結 |
'MA' || LPAD(@master._id,10,'0') |
条件式の優先順位
1.括弧
複数の演算子を組み合わせる条件式の場合、括弧で括られた条件が優先して扱われます。
括弧がない場合は、演算子間の優先順位に従います。
2.演算子間の優先順位
演算子の優先順位は以下となります。優先順位が同列の場合は左側に記述された条件から処理されます。
順位 | 演算子 |
---|---|
1 | * % / |
2 | + - |
3 | || |
4 | IS NULL、IS NOT NULL |
5 | LIKE、ILIKE |
6 | IN |
7 | ANY CONTAIN、ALL CONTAIN |
8 | < <= > >= |
9 | = <> |
10 | NOT |
11 | AND |
12 | OR |
(例)【営業部か開発部で、30歳以上】のレコードを検索する場合
【○】正しい条件式
(@department = 'sales' OR @department = 'development') AND @age >= 30
※ 括弧が優先され、【[営業部か開発部]で30歳以上】を検索します
【✕】誤った条件式
@department = 'sales' OR @department = 'development' AND @age >= 30
※ 演算子の優先順位に従い、ORよりもANDが優先され、【営業部か[開発部で30歳以上]】を検索します。
高度な条件設定の条件式の上限
アプリ利用画面およびアプリ管理画面の高度な条件設定には、条件式の長さに制限があります。
アプリ利用画面のレコード詳細検索は3000bytesまで、その他の機能では4096bytesまでが上限です。
SPIRAL ver.2の独自関数
以下の関数を使用することで、細かな条件でレコード抽出を行うことができます。
関数 | 説明 | DBトリガレコードアクションの制限 | 使用例 | 備考 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
引数指定可能フィールドタイプ |
マッピング可能フィールドタイプ |
||||||||||||||||||||
NOW() | 現在日時を取得 | 引数は指定できません。 | 日付, 日時, 時刻, テキスト, テキストエリア | NOW() | UTC(協定世界時)の現在日時を取得します。 | ||||||||||||||||
LENGTH(_str) | 文字列の長さを取得 |
テキスト, テキストエリア, メールアドレス |
整数, 数値, テキスト, テキストエリア | LENGTH('おはよう') | バイト数ではなく文字数を取得します。 | ||||||||||||||||
DATE(_str) | 文字列を日付に変換 | テキスト, テキストエリア |
日付, 日時, テキスト, テキストエリア |
DATE('2022-05-01')
高度な条件設定、APIのクエリパラメータwhereで可能な使用例 DATE(NOW()) |
|||||||||||||||||
DATE_TIME(_str) | 文字列を日時に変換 | 使用できません。 | 使用できません。 | DATE_TIME('2022-05-01 12:30:00') | |||||||||||||||||
MONTH_DAY(_str) | 文字列を月日に変換 |
テキスト, テキストエリア |
月日, テキスト, テキストエリア |
MONTH_DAY('05-31') |
ハイフンは必須。1桁の月・日は0を省略できます。 | ||||||||||||||||
YEAR_MONTH(_date) | 年月の値を抽出 |
日付, 日時 |
テキスト, テキストエリア |
YEAR_MONTH(@dateField)
DBトリガの条件指定・処理マッピングで可能な使用例 YEAR_MONTH(DATE(@dbName.textField)) |
引数に日付型、日時型のフィールド、または関数で変換した値を指定します。 '2023-10'のように年月の値を文字列で返します。 |
||||||||||||||||
MONTH_DAY_EXTRACT(_date) | 月日の値を抽出 |
日付, 日時, 月日 |
テキスト, テキストエリア |
MONTH_DAY_EXTRACT(@dateField)
DBトリガの条件指定・処理マッピングで可能な使用例 MONTH_DAY_EXTRACT(DATE(@dbName.textField)) |
引数に日付型、日時型のフィールド、または関数で変換した値を指定します。 '10-26'のように月日の値を文字列で返します。 |
||||||||||||||||
YEAR(_date) | 年を取得 |
日付, 日時 |
テキスト, テキストエリア, 整数 |
YEAR(@dateField) YEAR(DATE('2022-08-01'))
DBトリガの条件指定・処理マッピングで可能な使用例 YEAR(DATE(@dbName.textField)) |
引数に日付型、日時型のフィールド、または関数で変換した値を指定します。 年の値を整数で返します。 |
||||||||||||||||
MONTH(_date) | 月を取得 |
日付, 日時, 月日 |
テキスト, テキストエリア, 整数 |
MONTH(@dateField) MONTH(MONTH_DAY('05-31'))
DBトリガの条件指定・処理マッピングで可能な使用例 MONTH(DATE(@dbName.textField)) |
引数に日付型、日時型、月日型のフィールド、または関数で変換した値を指定します。 月の値を整数で返します。 |
||||||||||||||||
DAY(_date) | 日を取得 |
日付, 日時, 月日 |
テキスト, テキストエリア, 整数 |
DAY(@dateField)
高度な条件設定、APIのクエリパラメータwhereで可能な使用例 DAY(DATE_TIME('2022-08-01 12:30:00'))
DBトリガの条件指定・処理マッピングで可能な使用例 DAY(DATE(@dbName.textField)) |
引数に日付型、日時型、月日型のフィールド、または関数で変換した値を指定します。 日の値を整数で返します。 |
||||||||||||||||
INTERVAL(_str) | 文字列をインターバルに変換 |
テキスト, テキストエリア |
日付, 日時, 時刻, テキスト, テキストエリア |
DATE('2021-10-01') - INTERVAL('1 days')
高度な条件設定、APIのクエリパラメータwhereで可能な使用例 DATE(NOW()) - INTERVAL('3 days')
DBトリガの条件指定・処理マッピングで可能な使用例 DATE(@dbName.textField) + INTERVAL(@dbName.textField) |
日付型、日時型、月日型のフィールドと加減演算ができます。 INTERVAL関数のみでは使用できません。
|
||||||||||||||||
INTEGER(_str) | 文字列を整数に変換 | テキスト, テキストエリア | テキスト, テキストエリア, 整数 |
INTEGER('100')
DBトリガの条件指定・処理マッピングで可能な使用例 INTEGER( @dbName.textField) |
|||||||||||||||||
MULTISELECT(_str) | 文字列をマルチセレクトに変換 | テキスト, テキストエリア | マルチセレクト |
MULTISELECT('0','1')
DBトリガの条件指定・処理マッピングで可能な使用例 MULTISELECT(@dbName.textField) |
引数にラベルではなくIDを指定します。 | ||||||||||||||||
PHONE(_str) | 文字列を電話番号に変換 | 使用できません。 | 使用できません。 | PHONE('080-1111-1111') | ※DBトリガ>レコードアクションの発動条件、処理マッピングでは使えません。 | ||||||||||||||||
MULTI_REF_ARRAY(_id) | 複数参照の参照フィールドのマッピングをする為の配列に変換 | 整数 | 参照フィールド |
MULTI_REF_ARRAY(1,2,3) MULTI_REF_ARRAY(@dbName._id) |
第1引数から第20引数まで指定可能です。(複数参照フィールドの最大が20個のため) ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
||||||||||||||||
LPAD(_str, _len, _fill) | 先頭を文字で埋めて桁を揃える | _id, テキスト, テキストエリア, 整数 | テキスト | LPAD(@dbName._id, 7, '0') | 第1引数にフィールドや文字列を指定します。 第2引数に桁数を指定します。 第3引数に左埋めする文字列を指定します。 ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
||||||||||||||||
RANDOM_RANGE(_start, _end) | ランダム値生成(数字のみ、範囲指定あり) | 整数 | テキスト, テキストエリア, 整数 |
RANDOM_RANGE(1, 10) RANDOM_RANGE(@dbName.integerField, @dbName.integerField) |
第1引数に範囲指定開始の数字を指定します。(0~) 第2引数に範囲指定終了の数字を指定します。(1~18) ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
||||||||||||||||
RANDOM_NUM(_len) | ランダム値生成(数字のみ、範囲指定なし) | 整数 | テキスト, テキストエリア, 整数 |
RANDOM_NUM(5) |
引数に桁数を指定します。(1~18) ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
||||||||||||||||
RANDOM_ALP(_len) | ランダム値生成(アルファベットのみ) | 整数 | テキスト, テキストエリア | RANDOM_ALP(8) 除外リストを指定する場合の例 RANDOM_ALP(10,'[A-Z]') |
第1引数に桁数を指定します。(1~128) |
||||||||||||||||
RANDOM_NUM_ALP(_len) | ランダム値生成(数字・アルファベット) | 整数 | テキスト, テキストエリア | RANDOM_NUM_ALP(10) 除外リストを指定する場合の例 RANDOM_NUM_ALP(10,'[1,l,1,0,o]') |
第1引数に桁数を指定します。(1~128) 第2引数(任意)に除外したい値を指定します。指定方法はこちらをご覧ください。 ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
||||||||||||||||
RANDOM_NUM_ALP_SYM(_len) | ランダム値生成(数字・アルファベット・記号) | 整数 | テキスト, テキストエリア | RANDOM_NUM_ALP_SYM(10) 除外リストを指定する場合の例 RANDOM_NUM_ALP_SYM(10, '[A-Z,1,\\,,@]') |
値生成に使用する数字・アルファベット・記号はASCIIコード33~126です。 第1引数に桁数を指定します。(1~128) 第2引数(任意)に除外したい値を指定します。指定方法はこちらをご覧ください。 ※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。 |
RANDOM関数の除外文字の指定方法
・第2引数に[]で除外文字を記述します(1文字だけでも[]でくくる必要があります)
・複数ある場合、カンマ区切りで指定します。
・下記の3種類のみ、まとめて指定可能です。
A-Z(大文字アルファベット)
a-z (小文字アルファベット)
0-9(数字)
・[B-D],[1-9]のような指定はできません。
・「,(カンマ)」を除外する場合、エスケープ文字「\\」と共に記述します。
例)[A-Z,1,\\,,@]
関数を使ったレコード検索例
日時が現在よりも前のレコードを検索
@dateTime < NOW()
公開開始日が今日以前を検索
@date <= DATE(NOW())
公開終了日が今日以降を検索
@enddate >= DATE(NOW())
文字数が100字以上のレコードを検索
LENGTH(@text) >= 100
日付が2014年5月1日のレコードを検索
@date = DATE('2014-05-01')
月日が5月1日のレコードを検索
@monthDay = MONTH_DAY('05-01')
月が四月のレコードを検索
MONTH(@date) = 4
予約日がイベントの3日以上前のものを検索
@reserveDate <= @eventDate - INTERVAL('3 days')
セミナー開催日が今日から1ヶ月以上前を検索
@date <= DATE(NOW()) - INTERVAL('1 month')
セミナー開催日が今日から1ヶ月前以降を検索
@date >= DATE(NOW()) - INTERVAL('1 month')
誕生日の月日が今日の月日から30日前以降を検索
@birthday >= DATE(NOW()) - INTERVAL('30 days')
誕生日の月日が今日の月日から30日後以前を検索
@birthday <= DATE(NOW()) + INTERVAL('30 days')
誕生日の月日が、今日から1ヶ月前以降、かつ、誕生日の月日が、今日から1ヶ月後以前を検索
@birthday >= DATE(NOW()) - INTERVAL('1 month') AND @birthday <= DATE(NOW()) + INTERVAL('1 month')
誕生日の月が今日の月と同じものを検索
MONTH(@birthday) = MONTH(NOW())
最終更新日時が今日から過去7日間のものを検索
@_updatedAt >= DATE(NOW()) - INTERVAL('7 days') AND @_updatedAt <= DATE(NOW())
整数値が100のレコードを検索
@integer = INTEGER('100')
この関数を使わなくても同様の検索はできます。:@integer = 100
電話番号が080-1111-1111のものを検索
@phone = PHONE('080-1111-1111')
関数を使った処理マッピング例
複数参照の参照フィールドのマッピングをする為の配列に変換
MULTI_REF_ARRAY(1,2,3)
接頭語「MA」と、レコードIDを元にゼロで左埋めした10桁の値を文字列連結した値を生成
'MA' || LPAD(@master._id,10,'0')
使用する数字範囲を指定して、数字のみでランダム値を生成
RANDOM_RANGE(1,10)
桁数を指定して、数字のみでランダム値を生成
RANDOM_NUM(18)
桁数を指定して、アルファベットのみでランダム値を生成
RANDOM_ALP(6)
桁数を指定して、数字とアルファベットでランダム値を生成
RANDOM_NUM_ALP(16)
桁数を指定して、数字とアルファベットと記号でランダム値を生成
RANDOM_NUM_ALP_SYM(16)
参照フィールドの指定方法
参照フィールドを条件式に使用する場合、それぞれ以下の内容に従って記載する必要があります。
参照フィールドを使った検索例
1レコード参照で、指定した参照先レコードと等しい @reference = '1'
複数レコード参照で、指定した参照先レコードのいずれかを含む @reference ANYCONTAINS('2','3') ※{@参照フィールド識別名}の形式で参照フィールドの参照先レコードに対して条件を指定できます。
参照先DB内のセレクトフィールドのラベル値のいずれかを含む
@reference.select ANYCONTAINS('1','2','3')
※{@参照フィールド識別名.参照先DBフィールド識別名}の形式で参照先DB内に含まれるフィールド値に対して条件を指定できます。
使用できる条件は、参照先DB内に含まれるフィールドのフィールドタイプによって変わります。
ユーザフィールドの指定方法
高度な条件設定における指定方法
ユーザフィールドを条件式に使用する場合、以下の内容に従って記載する必要があります。
※ユーザフィールドの条件式は アプリ利用画面>詳細検索>高度な条件設定 で指定できます。
ユーザフィールドの識別名
項目 | 識別名(指定方法) | 型 | データ例 |
---|---|---|---|
@fieldName | array | { "id":1234, "firstName":"太郎", "lastName":"スパイラル", "email":"spiral@example.com", "subEmail":"spiral-sub@example.com", "enabled":true } |
|
ユーザID |
@fieldName.id | integer | 1234 |
名 | @fieldName.firstName | text | 太郎 |
姓 | @fieldName.lastName | text | スパイラル |
メインメールアドレス | @fieldName.email | spiral@example.com | |
サブメールアドレス | @fieldName.subEmail | spiral-sub@example.com | |
状態(有効/無効) | @fieldName.enabled | boolean | true |
ユーザフィールドの関数
※既存の関数も型に合わせて使用できます。
関数 | 説明 | 使用例 | 備考 |
---|---|---|---|
IS_ME() | そのユーザが自分自身かどうかを返す | IS_ME(@fieldName) | 第一引数にユーザフィールドを指定します。 ※DBトリガ>レコードアクションの発動条件、処理マッピングでは使えません。 |
ユーザフィールドを使った検索例
ユーザIDが「111」と「222」を抽出
@fieldName ANYCONTAINS ('111', '222')
自分自身を抽出
IS_ME(@fieldName) = true
メインメールアドレスのドメインが「spiral-platform.com」と「sample.example.com」を抽出
@fieldName.email LIKE '%spiral-platform.com' OR @fieldName.email LIKE '%@sample.example.com'
有効ユーザを抽出
@fieldName.enabled = true
APIにおける指定方法
APIでユーザフィールドを使用する場合、以下の内容に従って記載する必要があります。
レコードを登録、変更API の入出力形式はフィールドタイプリファレンスを参照ください。
レコード取得APIのwhereパラメータで使用可能な演算子
演算子 | operator | value1 | 使用例 |
---|---|---|---|
いずれかに等しい | ANYCONTAINS | [”1”, “2”, “3”] | @fieldName ANYCONTAINS ('1', '2', '3') |
いずれも等しくない | NOT_ANYCONTAINS | [”1”, “2”, “3”] | @fieldName NOT ANYCONTAINS ('1', '2', '3') |
自分自身 | IS_ME | 指定しない | IS_ME(@fieldName)=true |
値あり | IS_NOT_NULL | 指定しない | @fieldName IS NOT NULL |
値なし | IS_NULL | 指定しない | @fieldName IS NULL |
※「いずれかに等しい」「いずれも等しくない」の演算子を使用している場合は30ユーザまで指定できます。
※表に記載されていない演算子を指定した場合、400エラーを返します。
レコード一覧取得API(1.1)のwhereパラメータでanycontains演算子を使用する場合の例
v1/apps/{app}/dbs/{db}/records?where=@fieldName ANYCONTAINS('1','2','3',...'29','30')
ログインフィルタにおけるフィールド値関係抽出の指定方法
高度な条件設定における指定方法
ログインフィルタのフィールド値関係抽出で高度な条件設定を使用して認証エリアDBフィールドを指定する場合、以下の形式で指定してください。
※ ログインフィルタで使用可能なフィールドタイプなどの詳細は レコード公開範囲 をご参照ください。
AUTH_RECORD('fieldName')
レコードリストを作成した申請DBと認証エリアを作成した社員DBにおいて、等級フィールド(class)と所属フラグフィールド(member)がそれぞれ一致している、
または担当者フィールド(representative)が一致しているレコードを検索する場合の例
( @class = AUTH_RECORD('class') AND @member = AUTH_RECORD('member') ) OR @representative = AUTH_RECORD('representative')