ver.2サポートサイト

HOME機能その他条件式や計算式の記法

条件式や計算式の記法

演算子や関数を直接記述することで、レコードの検索条件を指定したり、フィールドの格納値を自動で生成することができます。

以下の機能では、条件式を記述することでレコードの検索条件を指定できます。

・APIのクエリパラメータwhere

・アプリ利用画面およびアプリ管理画面の高度な条件設定

・アプリ管理画面のDBトリガレコードアクションの発動条件

 

以下の機能では、フィールドへ格納する値を自動生成することができます。

・アプリ管理画面のDBトリガレコードアクションの処理マッピング

 

参照フィールドの指定方法ユーザフィールドの指定方法ログインフィルタにおけるフィールド値関係抽出の指定方については各見出しをご参照ください。

フィールドの識別子またはフィールドタイプの書式

フィールドの識別子やフィールドタイプの値を式に使用する場合、それぞれ以下の表に従って記載する必要があります。

※一部のフィールドタイプはSPIRAL ver.2の独自関数を使用し、値をフィールドタイプの形式に変換する必要があります。

識別子またはフィールドタイプ 使用例 説明
name(識別子) @_id
@email
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()

シングルクォートで囲みます。
DATE関数を用いることで、文字列を日付に変換することも可能です。
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関数のみでは使用できません。
以下の単位を指定します。

文字列 意味
y,year,years 年単位
mon,month,months 月単位
w, week,weeks 週単位
d,day,days 日単位
h,hour,hours 時間単位
m,min,minute,minutes 分単位
s,sec,second,seconds 秒単位
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)
第2引数(任意)に除外したい値を指定します。指定方法はこちらをご覧ください。
※DB>トリガ>レコードアクションの処理マッピングのみ使用可能。

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 email spiral@example.com
サブメールアドレス @fieldName.subEmail email 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')