CHECK制約、DEFAULTキーワード、INSERT INTO ... SELECT ...: パラメータNULL時のデフォルト値
SQL ServerでパラメータがNULLの場合にデフォルト値を挿入するには、いくつかの方法があります。
方法
- デフォルト値の指定
パラメータのデータ型にデフォルト値を指定できます。
CREATE PROCEDURE [dbo].[TestProcedure]
(
@param1 INT = 10,
@param2 VARCHAR(50) = 'デフォルト値'
)
AS
BEGIN
-- ...
END
- CASE式
CASE式を使用して、パラメータがNULLの場合にデフォルト値を挿入できます。
DECLARE @param1 INT
DECLARE @param2 VARCHAR(50)
SET @param1 = NULL
SET @param2 = NULL
EXEC [dbo].[TestProcedure]
(
CASE WHEN @param1 IS NULL THEN 10 ELSE @param1 END,
CASE WHEN @param2 IS NULL THEN 'デフォルト値' ELSE @param2 END
)
- COALESCE関数
DECLARE @param1 INT
DECLARE @param2 VARCHAR(50)
SET @param1 = NULL
SET @param2 = NULL
EXEC [dbo].[TestProcedure]
(
COALESCE(@param1, 10),
COALESCE(@param2, 'デフォルト値')
)
- IIF関数
DECLARE @param1 INT
DECLARE @param2 VARCHAR(50)
SET @param1 = NULL
SET @param2 = NULL
EXEC [dbo].[TestProcedure]
(
IIF(@param1 IS NULL, 10, @param1),
IIF(@param2 IS NULL, 'デフォルト値', @param2)
)
注意事項
- デフォルト値を指定する場合は、データ型と一致する値を指定する必要があります。
- CASE式、COALESCE関数、IIF関数を使用する場合は、パラメータがNULLかどうかを判定する必要があります。
-- テーブル作成
CREATE TABLE [dbo].[TestTable]
(
[ID] INT IDENTITY(1, 1) PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[Age] INT NULL
)
-- デフォルト値の指定
CREATE PROCEDURE [dbo].[TestProcedure]
(
@name VARCHAR(50),
@age INT = 20
)
AS
BEGIN
INSERT INTO [dbo].[TestTable]
(
[Name],
[Age]
)
VALUES
(
@name,
@age
)
END
-- デフォルト値の確認
DECLARE @name VARCHAR(50)
DECLARE @age INT
SET @name = '山田太郎'
SET @age = NULL
EXEC [dbo].[TestProcedure]
@name,
@age
SELECT * FROM [dbo].[TestTable]
-- 結果
-- ID | Name | Age
-- --- | --- | ---
-- 1 | 山田太郎 | 20
TestProcedure
ストアドプロシージャは、@name
と@age
という2つのパラメータを受け取ります。@age
パラメータには、デフォルト値として20が指定されています。
TestProcedure
ストアドプロシージャは、@name
と@age
パラメータの値をTestTable
テーブルに挿入します。
@age
パラメータにNULL値が渡された場合、デフォルト値として20が挿入されます。
-- CASE式
DECLARE @name VARCHAR(50)
DECLARE @age INT
SET @name = '山田太郎'
SET @age = NULL
EXEC [dbo].[TestProcedure]
@name,
CASE WHEN @age IS NULL THEN 20 ELSE @age END
-- COALESCE関数
DECLARE @name VARCHAR(50)
DECLARE @age INT
SET @name = '山田太郎'
SET @age = NULL
EXEC [dbo].[TestProcedure]
@name,
COALESCE(@age, 20)
-- IIF関数
DECLARE @name VARCHAR(50)
DECLARE @age INT
SET @name = '山田太郎'
SET @age = NULL
EXEC [dbo].[TestProcedure]
@name,
IIF(@age IS NULL, 20, @age)
パラメータがNULLの場合にデフォルト値を挿入するその他の方法
CHECK制約を使用して、パラメータの値がNULLではないことを確認できます。
CREATE TABLE [dbo].[TestTable]
(
[ID] INT IDENTITY(1, 1) PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[Age] INT CHECK (Age IS NOT NULL)
)
この例では、Age
列にCHECK制約を設定しています。この制約により、Age
列にNULL値を挿入することはできません。
DEFAULTキーワードを使用して、列のデフォルト値を指定できます。
CREATE TABLE [dbo].[TestTable]
(
[ID] INT IDENTITY(1, 1) PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[Age] INT DEFAULT (20)
)
この例では、Age
列のデフォルト値を20に設定しています。Age
列に値を指定しない場合は、20が挿入されます。
INSERT INTO ... SELECT ... ステートメントを使用して、別のテーブルから値を挿入できます。
INSERT INTO [dbo].[TestTable]
(
[Name],
[Age]
)
SELECT
[Name],
CASE WHEN [Age] IS NULL THEN 20 ELSE [Age] END
FROM [dbo].[SourceTable]
この例では、SourceTable
テーブルからTestTable
テーブルに値を挿入しています。Age
列にNULL値がある場合は、20が挿入されます。
MERGEステートメントを使用して、既存のレコードを更新したり、新しいレコードを挿入したりできます。
MERGE [dbo].[TestTable] AS T
USING (
SELECT
[Name],
CASE WHEN [Age] IS NULL THEN 20 ELSE [Age] END AS [Age]
FROM [dbo].[SourceTable]
) AS S
ON T.[Name] = S.[Name]
WHEN MATCHED THEN
UPDATE SET
T.[Age] = S.[Age]
WHEN NOT MATCHED THEN
INSERT (
[Name],
[Age]
)
VALUES (
S.[Name],
S.[Age]
);
パラメータがNULLの場合にデフォルト値を挿入する方法はいくつかあります。使用する方法は、状況によって異なります。
sql sql-server t-sql