- BETWEENでは、二つ目と三つ目のオペランドのどちらかが動的パラメータでなければ、最初のオペランドを動的パラメータとすることができます。
一つ目のオペランドの型は、残りの二つが動的パラメータでなければ、それら動的ではないパラメータの型もしくはそれらを統合した型とみなされます。
WHERE ? BETWEEN DATE('1996-01-01') AND ?
-- 型はDATEとみなされます。
- BETWEENの二つ目、三つ目のオペランドを動的パラメータとすることができます。
これらの型は左辺のオペランドと同じ型とみなされます。
WHERE DATE('1996-01-01') BETWEEN ? AND ?
-- 型はDATEとみなされます。
- INでは一覧のうち一つでも動的パラメータではない項目があれば、左辺のオペランドを動的パラメータとすることができます。
左辺のオペランドの型は一覧にある動的でないパラメータの項目の型を統合した型とみなされます。
WHERE ? NOT IN (?, ?, 'Santiago')
-- 型はCHARとみなされます。
- INでは、最初のオペランドが動的パラメータではないか前掲のルールによりその型が決まる場合、INの述部の一覧に動的パラメータを置くことができます。
値の一覧に置かれた動的パラメータの型は、左辺のオペランドの型と同じものとみなされます。
WHERE FloatColumn IN (?, ?, ?)
-- 型はFLOATとみなされます。
- オペランドを2つ持つ演算子の、+・-・*・/・AND・OR・<・>・
=・<・>・<=と>=では、片方のオペランドを動的パラメータとすることができますが、両方を動的パラメータとすることはできません。
動的パラメータの型はもう片方のオペランドの型となります。
WHERE ? < CURRENT_TIMESTAMP
-- 型はTIMESTAMPとみなされます。
- CASTでは常に動的パラメータを利用できます。これにより動的パラメータに型を与えることができます。
CALL valueOf(CAST (? AS VARCHAR(10)))
- LIKE演算子の片方あるいは両方のオペランドを動的パラメータとすることが可能です。
左辺を動的パラメータとした場合、その型は右辺のオペランドと同じものとみなされます。なお最大長は型の最大長となります。右辺を動的パラメータとした場合、左辺のオペランドの長さと型が適用されます。
(LIKEではCHARとVARCHARの型を利用する事が可能です。詳細はConcatenationを参照してください。)
WHERE ? LIKE 'Santi%'
--型は最大長がjava.lang.Integer.MAX_VALUEの
--CHARとみなされます。
- 動的パラメータの?は、||演算子の片方の側にのみ置くことができます。
すなわち"? || ?"は不可能です。||演算子の片側にある?パラメータの型は、その反対側にある||演算子のオペランドの式の型によって決まります。もし反対側の式の型がCHARあるいはVARCHARであれば、動的パラメータの型はその型の最大長のVARCHARです。
もし反対側の式の型がCHAR FOR BIT DATAあるいはVARCHAR FOR BIT DATAであれば、動的パラメータの型はその方の最大長のVARCHAR FOR BIT DATAです。
SELECT BITcolumn || ?
FROM UserTable
-- 型はBITcolumnと同じ最大長のCHAR FOR BIT DATAとなります。
- 条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。
式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。)
SELECT c1 IS NULL ? ? : c1
-- この例では実行時に既定値を与えることができます。
-- その動的パラメータの型はc1と同じ型とみなされます。
-- :の両側に動的パラメータを置くことはできません。
- INSERT文のvaluesの一覧やselectの一覧に、動的パラメータを置くことができます。
動的パラメータの型は対象列の型と同じ型とみなされます。
INSERT INTO t VALUES (?)
-- 動的パラメータの型は、
-- t表の唯一つの列と同じ型となります。
INSERT INTO t SELECT ?
FROM t2
-- これは不可です。
- 副問合せと比較される?パラメータは、副問合せで選択された式の型をとります。
例を挙げます。
SELECT *
FROM tab1
WHERE ? = (SELECT x FROM tab2)
SELECT *
FROM tab1
WHERE ? = ANY (SELECT x FROM tab2)
-- 両方の場合において、動的パラメータの型は、
-- tab2.xと同じ型とみなされます。
- UPDATE文の値に対して動的パラメータを置くことができます。動的パラメータの型は、対照表の列の型と同じものとみなされます。
UPDATE t2 SET c2 =? -- c2と同じ型とみなされます。
- 単一オペランドをとる-や+の演算子にて、動的パラメータを利用可能です。
例を挙げます。
CREATE TABLE t1 (c11 INT, c12 SMALLINT, c13 DOUBLE, c14 CHAR(3))
SELECT * FROM t1 WHERE c11 BETWEEN -? AND +?
-– 両方の単一オペランドをとる演算子の型は、文脈に沿ってINTとなります。
-- (すなわち、c11がINTなので、単一オペランドをとる演算子もINTの型をとります。)
- LENGTHにて、動的パラメータを利用可能です。その型は最大長のVARCHARとみなされます。
SELECT LENGTH(?)
- 定量比較
? = SOME (SELECT 1 FROM t)
-- これは有効です。動的なパラメータの型はINTEGERとみなされます。
1 = SOME (SELECT ? FROM t)
-- これは有効です。動的なパラメータの型はINTEGERとみなされます。
- IS式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。