Flowletの関数・演算子


論理演算子

ブール値(boolean)に対する演算子として、and、or、notが使えます。 SQLとは違い、nullというブール値はありません。

演算結果
true and truetrue
true and falsefalse
true or truetrue
true or falsetrue
not truefalse
not falsetrue

andの方がorよりも優先されます。例えば、true or false and falseの結果は、 trueになります。
true or (false and false) -> true or false -> true
となるためです。
()を使って、優先順位を変えることができます。
(true or false) and false -> true and false -> false

aaa or bbbの場合、aaaがtrueならbbbは評価されずに結果はtrueになります。
また、aaa and bbbの場合、aaaがfalseならbbbは評価されずに結果はfalseになります。

比較演算子

x 比較演算子 y の構文で使える以下の演算子があります。

演算子説明
<小なり
lt小なり
>大なり
gt大なり
<=以下
le以下
>=以上
ge以上
=等しい
eq等しい
!=等しくない
ne等しくない
<>等しくない

< >をXMLに記述する場合は、&lt; &gt;のように記述します。
間違えやすいので、lt,gt,le,geの比較演算子を使った方がいいでしょう。

nullがある場合、以下のようになります。
<,>,<=,>=は、x,yどちらかにnullがあると結果はfalseになります。
=は、x,yどちらもnullあるいは、x,yどちらもnullではなくて等しい場合に、trueになります。
!=,<>は、x,yどちらもnullの場合はfalse、x,yどちらかがnullの場合は、trueになります。

BETWEEN

x between y and z は、以下の構文と同じ意味です。
x >= y and x <= z

NOT BETWEEN

x not between y and z は、以下の構文と同じ意味です。
x < y or x > z

IN

x in(y, z) は、以下の構文と同じ意味です。
x = y or x = z

NOT IN

x not in(y, z) は、以下の構文と同じ意味です。
x != y and x != z

nullの検証

値がnullかnullでないかを検証するには次の構文を使います。
x is null
x is not null
標準的なSQLとは異なり、次の構文も同じ意味になります。
x = null
x != null

Booleanの検証

to_boolean()でBooleanに変換した変数をtrueと比較するには、
Boolean変数 is trueを使います。
同様にfalseと比較するには、Boolean変数 is falseを使います。

算術演算子

Nazunaには、以下の算術演算子があります。
演算子説明結果
+1 + 23
-1 - 2-1
*2 * 36
/商 ※14 / 22
%余り5 / 21
※1 整数の割り算では、余りを切り捨て

算術関数

Flowletには、以下の算術関数があります。
関数戻り値の型説明結果
abs(Integer)Integer絶対値abs(-1)1
abs(Long)Long絶対値abs(-10000000000)10000000000
abs(BigDecimal)BigDecimal絶対値abs(-1.0)1.0
ceil(BigDecimal)BigDecimal引数より小さくない最小の整数ceil(-1.5)-1.0
degrees(BigDecimal)BigDecimal度に対応するラジアンdegrees(0.5)28.6478897565412
exp(BigDecimal)BigDecimal指数exp(1.0)2.71828182845905
floor(BigDecimal)BigDecimal引数より大きくない最大の整数floor(-42.8)-43
ln(BigDecimal)BigDecimal自然対数ln(2.0)0.693147180559945
pow(BigDecimal base, BigDecimal e)BigDecimalbaseのe乗pow(9.0, 3.0)729
radians(BigDecimal)BigDecimalラジアンに対応する度radians(45.0)0.785398163397448
random()BigDecimal0.0 〜 1.0 の乱数random()
round(BigDecimal)Long四捨五入round(42.4)42
sign(Integer)Integer引数の符号(-1, 0, 1)sign(-3)-1
sign(Long)Integer引数の符号(-1, 0, 1)sign(-30000000000)-1
sign(BigDecimal)Integer引数の符号(-1, 0, 1)sign(-3.0)-1
sqrt(BigDecimal)BigDecimal平方根sqrt(2.0)1.4142135623731
trunc(BigDecimal)BigDecimal切捨てtrunc(42.8)42

三角関数

Flowletには、以下の三角関数があります。
関数戻り値の型説明
acos(BigDecimal)BigDecimal逆余弦関数
asin(BigDecimal)BigDecimal逆正弦関数
atan(BigDecimal)BigDecimal逆正接関数
atan2(BigDecimal x, BigDecimal y)BigDecimaly/x の逆正接関数
cos(BigDecimal)BigDecimal余弦関数
sin(BigDecimal)BigDecimal正弦関数
tan(BigDecimal)BigDecimal正接関数

文字列演算子

Flowletには、以下の文字列演算子があります。
演算子戻り値の型説明結果
String || StringString文字列の連結'Hello ' || 'Nazuna''Hello Nazuna'

文字列関数

Flowletには、以下の文字列関数があります。
関数戻り値の型説明結果
ascii(String)Integer引数の第一文字のASCIIコードascii('x')120
btrim(String str[, String trim])Stringtrim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭と末尾から削除します。btrim('aabxyzbba', 'ab')'xyz'
chr(Integer)StringASCIIコードに対応する文字chr(120)'x'
length(String)Integer文字数length('なずな')3
lower(String)String文字列を小文字に変換lower('NAZUNA')'nazuna'
lpad(String str, Integer length[, String fill])Stringfill(デフォルトはスペース)をstrの先頭に追加してlengthの長さにします。strがlengthの長さを越えている場合は(右側が)切り捨てられます。lpad('abc', 6, 'xy')'xyxabc'
ltrim(String str[, String trim])Stringtrim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭から削除します。ltrim('aabxyz', 'ab')'xyz'
position(String:str2 in String:str)Integerstr中のstr2の位置(最初の文字は1)。position('cd' in 'abcde')3
repead(String str, Integer num)Stringstrをnum回繰り返します。repead('Nz', 4)'NzNzNzNz'
rpad(String str, Integer length[, String fill])Stringfill(デフォルトはスペース)をstrの末尾に追加してlengthの長さにします。strがlengthの長さを越えている場合は(右側が)切り捨てられます。rpad('abc', 6, 'xy')'abcxyx'
rtrim(String str[, String trim])Stringtrim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの末尾から削除します。rtrim('xyzaab', 'ab')'xyz'
strpos(String str, String str2)Integerstr中のstr2の位置。positionと引数の順序が逆になります。strpos('abcde', 'cd')3
substr(String str, Integer pos[, Integer num])Stringstr中のpos番目(最初の文字は1)からnum文字を取り出します。numを指定しない場合は、最後の文字まで取り出します。substr('abcdef', 3, 2)'cd'
substring(String:str from Integer:pos [for Integer:num])Stringsubstrと同じです。substr('abcdef' from 3 for 2)'cd'
trim([leading | trailing | both] [String:trim] from String:str)Stringtrim(デフォルトはスペース)で指定された文字のみを含む最長の文字列をstrの先頭、末尾、両側から削除します。trim(both 'ab' from 'aabxyzbba')'xyz'
upper(String)String文字列を大文字に変換upper('nazuna')'NAZUNA'
translate(String str, String src, String dest)Stringstr中のsrcで指定された文字列をdestで置き換えます。translate('abcdefgcd', 'cd', '12')'ab12efg12'

日付関数

Flowletには、以下の日付関数があります。
関数戻り値の型説明
now()Timestamp現在日時

パターンマッチング

LIKE

Flowletでは、SQLのようにlikeを使ったパターンマッチングができます。

String:str like String:pattern
String:str not like String:pattern

patternは、文字列の集合です。 likeは、patternによって示される文字列の集合にstrが含まれていればtrueを返します。

patternがパーセント記号(%)もしくはアンダースコア(_)を含んでいない場合、 patternは文字列そのものです。
アンダースコア(_)は、任意の一文字とマッチし、 パーセント記号(%)は、0文字以上の任意の文字列とのマッチします。

'xyz' like 'xyz' -> true
'xyz' like 'abc' -> false
'xyz' like 'x%'  -> true
'xyz' like 'x_z' -> true
'xyz' like '__z' -> true

正規表現

Flowletでは、正規表現を使ったパターンマッチングもできます。

演算子説明
~正規表現にマッチ、大文字小文字の区別あり'abcAde' ~ '[a-zA-Z]*'
~*正規表現にマッチ、大文字小文字の区別なし'abcAde' ~* '[a-z]*'
!~正規表現にアンマッチ、大文字小文字の区別あり'abcAde' !~ '[a-zA-Z]*'
!~*正規表現にアンマッチ、大文字小文字の区別なし'abcAde' !~* '[a-z]*'

条件式

CASE

条件に応じた値を返したい場合、case式を使うことができます。

下記の形式のcase式は、Javaのif文に似ています。
最初のwhen句の式がtrueの場合、then句の値を返します。。
falseであれば、同じように後続のwhenが調べられます。
すべてのwhen句の式がfalseの場合、else句の値を返します。。
else句がない場合は、nullを返します。

case when booleanを返す式 then 値
     [when booleanを返す式 then 値]
     [else 値]
end

例(aは変数)

case when a = 1 then 'one'
     when a = 2 then 'two'
     else 'other'
end

下記の形式のcase式は、Javaのswitch文に似ています。
式と最初のwhen句の値が等しい場合、then句の値を返します。。
等しくない場合、同じように後続のwhenが調べられます。
すべてのwhen句の式がfalseの場合、else句の値を返します。
else句がない場合は、nullを返します。

case 式
     when 値 then 値
     [when 値 then 値]
     [else 値]
end

上記のcase式は、下記のcase式の簡略形です。

case when 式 = 値 then 値
     [when 式 = 値 then 値]
     [else 値]
end

COALESCE

coalesceは、nullでない最初の引数を返します。

coalesce(value[, ...])

NULLIF

nullifは、value1とvalue2が等しい場合にnullを返します。 それ以外は、value1を返します。

nullif(value1, value2)

型変換関数

Flowletには、以下の型変換関数があります。
関数戻り値の型説明
to_string(Integer num, String pattern)StringnumをDecimalFormatのpatternでフォーマットします。
to_string(Long num, String pattern)StringnumをDecimalFormatのpatternでフォーマットします。
to_string(BigDecimal num, String pattern)StringnumをDecimalFormatのpatternでフォーマットします。
to_string(Timestamp ts, String pattern)StringtsをSimpleDateFormatのpatternでフォーマットします。
to_integer(String str)IntegerstrをIntegerに変換します。
to_integer(Timestamp ts, String pattern)IntegertsをSimpleDateFormatのpatternでフォーマットしてIntegerに変換します。
to_integer(Long num)IntegernumをIntegerに変換します。
to_integer(BigDecimal num)IntegernumをIntegerに変換します。
to_long(String str)LongstrをLongに変換します。
to_long(Timestamp ts, String pattern)LongtsをSimpleDateFormatのpatternでフォーマットしてLongに変換します。
to_long(Integer num)LongnumをLongに変換します。
to_long(BigDecimal num)LongnumをLongに変換します。
to_bigdecimal(String str)BigDecimalstrをBigDecimalに変換します。
to_bigdecimal(Timestamp ts, String pattern)BigDecimaltsをSimpleDateFormatのpatternでフォーマットしてBigDecimalに変換します。
to_bigdecimal(Long num)BigDecimalnumをBigDecimalに変換します。
to_bigdecimal(BigDecimal num)BigDecimalnumをBigDecimalに変換します。
to_double(String str)DoublestrをDoubleに変換します。
to_double(Timestamp ts, String pattern)DoubletsをSimpleDateFormatのpatternでフォーマットしてDoubleに変換します。
to_double(Long num)DoublenumをDoubleに変換します。
to_double(Integer num)DoublenumをDoubleに変換します。
to_double(BigDecimal num)DoublenumをDoubleに変換します。
to_boolean(boolean bool)java.lang.Booleanbooleanをjava.lang.Booleanに変換します。