MySQLで列が空またはnullかどうかを確認するにはどうすればよいですか?


288

nullまたは空の値を含む可能性のある列がテーブルにあります。テーブルに存在する行で列が空かnullかを確認するにはどうすればよいですか?

(e.g. null or '' or '  ' or '      ' and ...)

1
MySQLコード:select isnull(mycolumn) from mytablemycolumnがnullの場合、1を返します。
Eric

2
length(trim(mycolumn))> 0はどうですか?
Cyril Jacquart、2015年

MSSQLの場合> WHERE COLUMN <> '' OR WHERE LEN(COLUMN)> 0 OR WHERE NULLIF(LTRIM(RTRIM(COLUMN))、 '')IS NOT NULL
DxTx

回答:


444

これsome_colは、NULLまたは''(空の文字列)であるすべての行を選択します

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

7
条件をWHERE some_col IS NULL OR some_col = ' '(文字列にスペースを1つ挿入)に変更すると、MySQLとOracleの両方で機能します。「onedaywhen」の回答を参照してください。some_col = ''空の文字列はNULLを意味するため、Oracleでは機能しません。
ヨハンナ

1
@Johannaですが、に切り替えると' '、SQLiteでは機能しません。同一/直接の文字列照合のみを処理します。
Magne

131

SQL-92標準で定義されているように、幅の異なる2つの文字列を比較するとき、幅の狭い値は幅の広い値と同じ幅になるようにスペースが右に埋め込まれます。したがって、完全にスペース(ゼロスペースを含む)で構成されるすべての文字列値は等しいと見なされます。

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

したがって、これは、スペースの数に関係なく機能します。 some_col値です。

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

またはもっと簡潔に:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

6
埋め込みスペースについて言及していただきありがとうございます。それらを利用して条件をWHERE some_col IS NULL OR some_col = ' '(文字列にスペースを1つ挿入)に変更すると、MySQLとOracleの両方で機能します。some_col = ''空の文字列はそこでNULLを意味し、完全な条件はNULLになるため、Oracleでは機能しません。
ヨハンナ、

私の要件は、MySQLで検索SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; してSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;機能することでした。これが役立つことを願っています。
Dinuka Dayarathna 2017年

'' = ' 'SQLServerでは実際に機能しますが、SQLiteでは機能しませんが、今のところテストでは、私の知る限りではそうです。
Magne

66

条件を記述する短い方法:

WHERE some_col > ''

null > ''はを生成するのでunknown、これは両方nullと空の文字列を除外する効果があります。


2
これの逆を取得する方法はありますか?それがNULLまたは空の文字列であるすべてのレコードを取得しますか?
Joshua Pinter 2014

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar 2014

6
これはいつか本当だったかもしれませんが、MySQL 14.14では機能しません。
GunnarÞórMagnússon16年

MariaDBでnullフィールドと空のフィールドの両方をフィルターで除外する方法を見つけることができたのは、実際にうまく機能している唯一の方法です
Neal Davis

1
私はこれの逆を見つけるためにsome_col <> ''を使用しています
Chargnn

18

あなたは、列がnullであるか、使用してnullでないかどうかをテストすることができますWHERE col IS NULLWHERE col IS NOT NULLたとえば、

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

あなたの例では、空白のさまざまな順列があります。を使用TRIMして空白を削除し、を使用COALESCEしてNULL値をデフォルト設定できます(COALESCEは、指定した値から最初の非null値を返します。

例えば

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

この最後のクエリMyColは、nullまたは任意の長さの空白である行を返します。

回避できる場合は、WHERE句の列に関数を持たない方がよいでしょう。インデックスを使用するのが難しくなるためです。列がnullまたは空かどうかを確認するだけの場合は、次のようにするとよいでしょう。

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

詳細については、TRIM COALESCEおよびIS NULLを参照してください。

また、ヌル値を使用した作業のMySQLのドキュメントから


2
あなたは本当の解決策を非常に複雑な方法で提示します。まず、「mycolがnullである」という彼の問題に対する不完全な解決策を提示します。次に、回避する必要があると言っていても、where句で2つのネストされた関数を使用してソリューションを提示します。そうして初めて、本当の解決策にたどり着きます。将来的には、最初に実際のソリューションを提示してください。

行方不明)の前に=、あなたの第二の例では、符号
Rorrim

15

WHEREのない別の方法は、これを試してください。

空の値とNULL値の両方を選択します

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

nullがある場合、これは1を返しますが、なぜそうなのですか?
noobie-php 2016

NULLIFはフィールド名で空の値をチェックし、空の場合はNULLに変換します。NULLIFが空のフィールドを正常にNULLに変更した場合、またはすでにNULLであった場合、ISNULLは1(true)を返します。 、nullif(y)を選択
PodTech.io

9

どちらか

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

または

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

データベースの乱雑なフィールドは嫌いです。列が空白の文字列またはnullである可能性がある場合は、次のように、毎回選択を行う前にこれを修正します。

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

これは、何らかの理由でNULLと空を明確に区別する必要がない限り、データを整然と保ちます。


5

試す

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

または

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

参照


5

このステートメントは、私にとってはるかにクリーンで読みやすくなっています。

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

null or Emptyプロジェクトの列の値を確認しているときに、さまざまなデータベースでサポートに関する懸念があることに気付きました。

すべてのデータベースはサポートしていません TRIM 方法。

以下は、さまざまなデータベースでサポートされているメソッドを理解するためのマトリックスです。

SQLのTRIM関数は、指定されたプレフィックスまたはサフィックスを文字列から削除するために使用されます。削除される最も一般的なパターンは空白です。この関数は、データベースによって呼び出す方法が異なります。

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • SQLサーバー: RTRIM(), LTRIM()

空/ヌルをチェックする方法:-

以下は、異なるデータベースに応じた2つの異なる方法です。

これらのトリム関数の構文は次のとおりです。

  1. トリムを使用したチェック

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. LTRIMとRTRIMを使用したチェック

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

上記のどちらの方法でも、データベースのサポートに基づいて使用するだけで同じ結果が得られます。空の場合は、FirstNamefrom UserDetailsテーブルを返すだけですLastName

これがあなたを助けることを願っています:)


3

ORDER BYを実行するときに最後にNULL値を表示したい場合は、次を試してください。

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

あなたもすることができます

SELECT * FROM table WHERE column_name LIKE ''

逆の存在

SELECT * FROM table WHERE column_name NOT LIKE ''

どうやら動作しません:select NULL like ''戻り値NULL-少なくともMySQLでは。
タイタス

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

nullになることがあるフィールドと比較して問題が発生しました。これは次のことを助けました:col1 != IFNULL(col2,'')
webaholik

1

nullを確認する

$column is null
isnull($column)

空を確認

$column != ""

ただし、列には常にNOT NULLを設定する必要があります
。mysqlの最適化で処理できるIS NULLレベルは1つだけです。


3
NULL値を決して受け入れないことは、議論のための別の全体的なトピックです。私はあなたの推論を提供することなくその推奨をすることは適切ではないと思います。
マセック

私は含めました、我慢してください。さらに、(この質問のように)NULLを使用すると、実際に処理が困難になります。
ajreal 2011

5
それはひどい勧告です。INSERTの時点で値が不明である可能性がある列にNOT NULLを設定することは、-1およびのような非標準の「null」値の使用を促進するためにのみ役立ちます''
Dan Bechard、2014

@Dan挿入時の値がわからない場合、可能性のある最適化を行うのが難しい場合があります
ajreal


0

私の場合、データのインポート中に列にスペースが入力されましたが、空の列のように見えましたが、その長さは1でした。そのため、まず空の列の長さを確認し、length(column)これに基づいて検索クエリを記述できます。

SELECT * FROM TABLE WHERE LENGHT(COLUMN)=空の列の列の長さ


-1

データ型が文字列で行がnullの場合はこれを試してください

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

データ型がintまたはcolumnが0の場合、これを試してください

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
間違った答え。これは選択しませんNULL
2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.