【Laravel】whereで「〜ではない」を指定する時に !=、 <> どちらが良いのか?

LaravelのEloquent(ORM)で条件を指定してデータを取得する時に使用するwhere()で、「◯◯ではない」を指定する場合に選択肢として

  • !=
  • <>

があります。

以下のような書き方をした場合、どちらも同じような挙動になります。

// !=
Model::where('column', '!=', 'value')->get();

// <>
Model::where('column', '<>', 'value')->get();

この記事では上記2つのどちらを使うのが良いかを色々調べたので書きます。

目次

調べてわかったこと

!=でも<>でも「◯◯ではない」の指定はできる

冒頭の繰り返しになりますが、どちらを使った場合でも実装は可能です。

// !=
Model::where('column', '!=', 'value')->get();

// <>
Model::where('column', '<>', 'value')->get();

色々調べていく中で記事情報は伏せますが、

where('column', '!=', '1')と書いてしまうのは間違いです。」

と書かれていましたが、特段間違いではないです。

!=だと該当のカラムがnullの場合は抽出できない

先ほどはどちらも可能と書いたのですが、若干の違いがあります。

!=を使って「◯◯ではない」「◯◯以外」を指定する場合、対象カラムにnullではないデータは抽出することができません。

Model::where('column', '!=', 'value')->get();

発行されたSQLにはそのままの演算子として使われる

where(column != ?)

where(column <> ?)

余談ですが、LaravelではtoSql()を使うことでEloquentを使ったコードで発行されるSQL文を取得することができます。

// !=
Model::where('column', '!=', 'value')->toSql();

// <>
Model::where('column', '<>', 'value')->toSql();

QueryBuilderへのwhereNot()の追加を提案するIsuueがあった

Isuueのやりとりを追った感じ、whereNot()は追加されることなくClosedになっていて、Laravel8時点でも追加されていないです。

!=<>の違い

調べてみるとSQLの演算子としての!=<>の違いは以下のとおりであるとわかります。

  • <>:SQL標準規格の比較演算子
  • !=:DBMS独自定義または拡張の比較演算子

!=はDBMSによっては使えない、という意味ですがこれも調べると

  • MySQL
  • PostgreSQL
  • Oracle

で使えることがわかました。

MySQL、PostgreSQLが多く使われると思うので確率的にはどちらも普通に使えそうです。

Laravel9.3でwhereNot()が追加される

Laravel9.3から少し前に書いたwhereNot()が追加されるようです。

これで!=<>のどっちを使えば良いんだ…とこの記事のように悩む必要がなくなりますね。

Twitterのフォロワーさんから情報をいただきました。ありがとうございました。

最後に

!=と<>のどっちを使うのがいいんだ?への結論は

  • nullも抽出できること、SQL標準であることから<>を使うのが確実
  • Laravel9.3からwhereNot()が追加されるのでそれ以降はwhereNot()を使うのが良さそう

です。

Laravelの学習にオススメの書籍や教材はこちらにまとめています。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

この記事を書いた人

大学院(機械工学)→重工業→エンジニア→プロダクトマネージャー(PdM)兼エンジニア

神戸で「つながる勉強会」を運営↓
https://tsunagaru-kobe.connpass.com/

神戸グルメのインスタアカウントを運用しています。

目次
閉じる