CHECK制約、DEFAULTキーワード、INSERT INTO ... SELECT ...: パラメータNULL時のデフォルト値

2024-04-07

SQL ServerでパラメータがNULLの場合にデフォルト値を挿入するには、いくつかの方法があります。

方法

  1. デフォルト値の指定

パラメータのデータ型にデフォルト値を指定できます。

CREATE PROCEDURE [dbo].[TestProcedure]
(
    @param1 INT = 10,
    @param2 VARCHAR(50) = 'デフォルト値'
)
AS
BEGIN
    -- ...
END
  1. 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
)
  1. COALESCE関数
DECLARE @param1 INT
DECLARE @param2 VARCHAR(50)

SET @param1 = NULL
SET @param2 = NULL

EXEC [dbo].[TestProcedure]
(
    COALESCE(@param1, 10),
    COALESCE(@param2, 'デフォルト値')
)
  1. 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


ID列の命名規則:MySQL、PostgreSQL、SQL Server、Oracle Database

データベーステーブルのID列の名前は、データベース全体の一貫性と理解性を向上するために、明確な命名規則に従うことが重要です。このガイドでは、ID列の命名規則に関する一般的なベストプラクティスと、さまざまなデータベース管理システム (DBMS) で推奨される命名規則について説明します。...


SQL Serverのパフォーマンスチューニング:インデックス、統計情報、クエリプラン

SQL Server で、直接実行すると高速なクエリが、ストアドプロシージャとして実行すると遅くなる場合があります。原因この現象には、いくつかの原因が考えられます。パラメータのスニッフィング: SQL Server は、クエリのパラメータ値に基づいて実行計画を生成します。ストアドプロシージャの場合、パラメータ値が事前にわからないため、最適な実行計画が生成できない可能性があります。...


データ分析、トランザクション処理、オブジェクト指向...それぞれの得意分野

SQLは、Structured Query Languageの略で、データベースとの対話に特化した汎用的な言語です。主な機能は以下の通りです。データの検索、更新、挿入、削除テーブルの作成、変更、削除データベースの構造の定義インデックスの作成、削除...


SQL Server 接続における Integrated Security と SSPI の違い

SQL Server に接続する際、Integrated Security という接続文字列オプションを使用することができます。これは、Windows 認証を使用してユーザーを認証する便利な方法です。Integrated Security には True と SSPI という 2 つの値がありますが、何が違うのでしょうか?...


MySQL の CONCAT 関数:NULL 値の罠を回避して完璧な結合を実現

MySQL の CONCAT() 関数は、複数の文字列を結合するために使用されます。しかし、引数のうち一つでも NULL 値である場合、CONCAT() 関数は NULL を返します。これは、多くの場合予期せぬ結果をもたらす可能性があります。...