.NET開発者のためのブログメディア
SQLServerでのnullの扱い方について・update文やdelete文でのNULL要素のレコードの操作

- SE
- SQLServerでNULLのレコードを取得するにはどうすればいいのですか。
- PM
- 「is null演算子」を使います。その他、NULL以外のレコードを操作するには「is not null演算子」を使います。
目次
SQLServerでのnullの扱い方について
今回は、SQLServerでのNULLの扱い方について説明します。
NULLのレコードを操作(select/update/delete)する方法やNULL以外のレコードを操作する方法を紹介します。また、要素がNULLの場合は指定文字に置換することもできます。
SQLServerでのNULLの扱い方に興味のある方はぜひご覧ください。
is null演算子
SQLServerでは、NULLか否かをチェックする「is null演算子」があります。
主にwhere句で使用し、NULLのレコードを取得できます。
ここでは、以下のような”table_1″テーブルがあるとします。
1
2
3
4
5
6
7
|
id last_name first_name phone birth_date
-------------------- ---------- ---------- ---------------- ----------------
NULL taro tanaka 090-1234-5678 1970-12-15
2 NULL yamada 03-2345-6789 1980-01-02
3 ichiro NULL 080-1111-2222 1990-02-05
4 sato NULL 2000-08-12
5 jiro 070-6666-7777 NULL
|
is null演算子を使った例を見てみましょう。
1
2
|
select * from table_1 where last_name is null;
go
|
実行結果は以下のようになります。
1
2
3
|
id last_name first_name phone birth_date
-------------------- ---------- ---------- ------------- ----------------
2 NULL yamada 03-2345-6789 1980-01-02
|
last_nameがNULLのレコードが取得できていることが分かります。
このように、SQLServerではis null演算子を使用して、NULLのレコードを取得できます。
is not null演算子
SQLServerでは、is null演算子とは逆に、NULLでないレコードを取得できる「is not null演算子」があります。
実際のSQL文を見てみましょう。
1
2
|
select * from table_1 where first_name is not null;
go
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
id last_name first_name phone birth_date
-------------------- ---------- ---------- ------------- ----------------
NULL taro tanaka 090-1234-5678 1970-12-15
2 NULL yamada 03-2345-6789 1980-01-02
4 sato NULL 2000-08-12
5 jiro 070-6666-7777 NULL
|
first_nameがNULLでないレコードが取得できていることが分かります。
このように、SQLServerではis not null演算子を使用して、NULLではないレコードを取得できます。
nullまたは空白を取得
先ほどはNULLのレコードを取得する方法を紹介しました。
ここでは、NULLまたは空白のレコードを取得する方法を紹介します。
実際のSQL文を見てみましょう。
1
2
|
select * from table_1 where last_name is null or last_name = '';
go
|
実行結果は以下のようになります。
1
2
3
4
|
id last_name first_name phone birth_date
-------------------- ---------- ---------- ------------- ----------------
2 NULL yamada 03-2345-6789 1980-01-02
4 sato NULL 2000-08-12
|
last_nameがNULLまたは空白のレコードが取得できていることが分かります。
is null演算子とor句でつないで、NULLまたは空白のレコードが取得します。
isnull関数
SQLServerでは、NULLの要素を指定文字列で置換する「isnull関数」があります。
次のように記述します。
1
|
isnull( 要素, 置換文字列 )
|
実際のSQL文を見てみましょう。
1
2
|
select isnull(last_name, '') as last_name from table_1;
go
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
|
last_name
----------
taro
ichiro
jiro
|
nullの要素が空文字”に置換されていることが分かります。
このように、SQLServerではisnull関数を使用して、NULLの要素を指定文字列で置換します。
caseでnullを取得する
先ほどはisnull関数を使用して、NULLの要素を指定文字列で置換する方法を紹介しました。
isnull関数ではなく、case文でも同じことができますので、その方法を紹介します。
実際のSQL文を見てみましょう。
1
2
|
select case when last_name is null then '' else last_name end as last_name from table_1;
go
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
|
last_name
----------
taro
ichiro
jiro
|
このように、SQLServerではcase文でも、NULLの要素を指定文字列で置換できます。
update文やdelete文でnullを扱う
select文だけでなく、update文やdelete文のwhere句でも、NULL要素のレコードの操作ができます。
それではupdate文の例を見てみましょう。
1
2
3
4
|
update table_1 set last_name = 'unknown' where last_name is null;
go
select last_name from table_1;
go
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
|
last_name
----------
taro
unknown
ichiro
jiro
|
last_nameがNULLのレコードを更新できていることが分かります。
次に、delete文の例を見てみましょう。
1
2
3
4
5
6
|
select id, first_name from table_1;
go
delete from table_1 where first_name is null;
go
select id, first_name from table_1;
go
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
id first_name
-------------------- ----------
NULL tanaka
2 yamada
3 NULL
4 sato
5
id first_name
-------------------- ----------
NULL tanaka
2 yamada
4 sato
5
|
first_nameがNULLのレコードが削除されていることが分かります。
このように、select文だけでなく、update文やdelete文のwhere句でも、NULL要素のレコードの操作ができます。
- SE
- NULLはisnull関数やcase文でも操作できるのですね。
- PM
- はい。update文やdelete文でもnullを扱うことができます。
まとめ
いかがでしたでしょうか。SQLServerでのNULLの扱い方について説明しました。
NULLのレコードを操作(select/update/delete)する方法やNULL以外のレコードを操作することができます。また、要素がNULLの場合は指定文字に置換することもできます。
ぜひご自身でSQL文を書いて、理解を深めてください。
Search キーワード検索
Popular 人気の記事
reccomended おすすめ記事
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)