MySQLのINTERVAL()関数で第1引数にNULLを指定した場合の戻り値とは?
INTERVAL()関数の第1引数がNULLだった場合の戻り値
MySQLのINTERVAL()関数は、第1引数と残りの引数リストを比較し、第1引数の値がどこまで続く範囲に該当するかを示すインデックスを返す関数です。そして重要なポイントとして、第1引数にNULLを指定した場合、戻り値は必ず-1になります。実際の動作を以下の例で確認してみましょう。
mysql> Select INTERVAL(NULL,20,32,38,40,50,55);
+--------------------------------------+
| INTERVAL(NULL,20,32,38,40,50,55) |
+--------------------------------------+
| -1 |
+--------------------------------------+
1 row in set (0.00 sec)
他の引数にもNULLが含まれる場合
第1引数以外の引数にもNULLが含まれている場合でも、第1引数さえNULLであれば、結果は同じく-1が返されます。
mysql> Select INTERVAL(NULL,20,32,NULL,40,50,NULL);
+--------------------------------------+
| INTERVAL(NULL,20,32,NULL,40,50,NULL) |
+--------------------------------------+
| -1 |
+--------------------------------------+
1 row in set (0.00 sec)
第1引数がNULL以外の場合の挙動
一方、第1引数がNULLではなく、それ以外の引数の一部(または複数)がNULLであるケースでは、NULL以外の実在する値との比較に基づき、条件を満たす大きな値のインデックス(存在する場合)が返されます。
mysql> Select INTERVAL(50,20,NULL,55,40,50,NULL);
+------------------------------------+
| INTERVAL(50,20,NULL,55,40,50,NULL) |
+------------------------------------+
| 2 |
+------------------------------------+
1 row in set (0.00 sec)
このように、INTERVAL()関数におけるNULLの扱いは、NULLが第1引数側にあるのか、それ以外の引数側にあるのかによって結果が大きく異なります。NULLが混入する可能性のあるカラムに対してこの関数を使用する場合は、意図しない-1が返されることを避けるため、事前にNULLチェックを行うなどの対策を検討しておくと安心です。
-
ビット値が1でも最初の文字列がNULLの場合、MySQLのMAKE_SET()関数は何を返す?
MySQLのMAKE_SET()関数におけるNULL文字列の扱いMySQLのMAKE_SET()関数は、指定されたビット値に基づいて複数の文字列からセットを構築して返す関数です。ただし、ビットの値が1であっても、そのビットに対応する文字列がNULLである場合、関数はその文字列を結果に含めず、何も返しません(空の結果となります)。動作の仕組みMAKE_SET()関数では、第1引数のビット値によってどの文字列を選択するかが決まります。最下位ビット(値1)は最初の文字列に、次のビット(値2)は2番目の文字列に、というように各ビットが順番に対応しています。そして、選択対象となった文字列がNULLだった
-
MySQLの<=>演算子とは?NULL安全な等価比較の使い方を解説
MySQLには、NULL値も安全に比較できる特殊な等価演算子 <=>(NULL安全等価演算子)が用意されています。この記事では、<=> 演算子の動作と、通常の = 演算子との違いを具体例とともに解説します。 ケース1:通常の値の比較(= 演算子と同じ動作) <=> 演算子は、NULL以外の値同士を比較する場合、= 演算子とまったく同じように動作します。つまり、両辺の値が等しければ「1(TRUE)」、等しくなければ「0(FALSE)」を返します。 たとえば、次のような比較では、どちらの演算子でも結果は同じになります。 mysql> SELECT 10