MariaDB 初心者向け: LAG 関数のデフォルト値の謎を解き明かす
MariaDB の LAG 関数は、指定された行の前の行の値を取得する関数です。デフォルトでは、前の行の値が NULL の場合、LAG 関数は 123456 という値を返します。
デフォルト値の詳細
- デフォルト値 123456 は、特別な意味を持つ値ではありません。これは、LAG 関数が NULL 値を処理する方法を明確にするために選択された単なる数値です。
- デフォルト値は、
DEFAULT
キーワードを使用して変更できます。 - LAG 関数は、前の行の値が NULL の場合、NULL 値を返すように設定することもできます。
例
-- デフォルト値の例
SELECT
id,
name,
LAG(salary) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | 123456
3 | Bill Smith | 100000
-- デフォルト値の変更
SELECT
id,
name,
LAG(salary, 0, 0) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | 0
3 | Bill Smith | 100000
-- NULL 値の返却
SELECT
id,
name,
LAG(salary, DEFAULT NULL) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | NULL
3 | Bill Smith | 100000
-- サンプルテーブル
CREATE TABLE employees (
id INT,
name VARCHAR(255),
salary INT
);
-- データ挿入
INSERT INTO employees (id, name, salary) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Doe', 100000),
(3, 'Bill Smith', 200000);
-- LAG 関数の使用例
-- デフォルト値
SELECT
id,
name,
LAG(salary) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | 123456
3 | Bill Smith | 100000
-- デフォルト値の変更
SELECT
id,
name,
LAG(salary, 0, 0) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | 0
3 | Bill Smith | 100000
-- NULL 値の返却
SELECT
id,
name,
LAG(salary, DEFAULT NULL) OVER (ORDER BY id) AS prev_salary
FROM employees;
-- 出力例
id | name | prev_salary
------- | -------- | --------
1 | John Doe | NULL
2 | Jane Doe | NULL
3 | Bill Smith | 100000
このサンプルコードは、LAG 関数の使用方法を説明しています。
- 最初の
SELECT
ステートメントは、デフォルト値 123456 を示しています。
LAG 関数のデフォルト値を扱う他の方法
DEFAULT キーワード
LAG 関数のデフォルト値を変更するには、DEFAULT
キーワードを使用できます。
SELECT
id,
name,
LAG(salary, DEFAULT 0) OVER (ORDER BY id) AS prev_salary
FROM employees;
この例では、LAG 関数は前の行の値が NULL の場合、0 を返します。
CASE 式を使用して、LAG 関数のデフォルト値を動的に設定することもできます。
SELECT
id,
name,
CASE WHEN LAG(salary) IS NULL THEN 0 ELSE LAG(salary) END AS prev_salary
FROM employees;
SELECT
id,
name,
COALESCE(LAG(salary), 0) AS prev_salary
FROM employees;
SELECT
id,
name,
(SELECT salary FROM employees WHERE id = id - 1) AS prev_salary
FROM employees;
- DEFAULT キーワードは、デフォルト値を簡単に設定できるため、最もシンプルで使いやすい方法です。
- CASE 式は、デフォルト値を動的に設定できるため、より柔軟な方法です。
- COALESCE 関数は、NULL 値を処理する際に便利な方法です。
- サブクエリは、より複雑なデフォルト値を設定できるため、より強力な方法です。
mariadb