Open5

Laravelのwhereで「ではない」「以外」を指定する時に「!=」、「<>」どちらを使うのが良いの?

ゆーたろーゆーたろー

概要

以下の書き方はどちらも想定どおりに機能しましたが結局どちらを使うのが望ましいのか、色々調べましたが確定的な情報が見つからないのでもしご存知の方はコメントを投稿いただけたら嬉しいです🙇‍♂️

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

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

調べてわかったこと

  • どちらも機能はする
  • が、!=だと該当のカラムがnullの場合は抽出できない(らしい)
  • どちらが良いというよりは上記の条件を見ながらマッチする方を使うのがいいのか?とも思う

調べた記事

https://blog.capilano-fw.com/?p=665#i-11

https://akizora.tech/eloquent-where-not-equal-4841
(こちらの記事で「where('role', '!=', '1')と書いてしまうのは間違いです。」と記載されていたのですがその理由が記載されておらず悔しいですが腹落ちしていません...)

https://laraweb.net/practice/4756/

ゆーたろーゆーたろー

!=<>で発行されているSQLを確認すると、使用している演算子がそのままSQLに使われている。

where(column != ?)

where(column <> ?)

補足:Laravelで発行されているSQLを確認する方法

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

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

QueryBuilderへのwhereNotの追加を提案するIsuue(情報提供ありがとうございました)

https://github.com/laravel/ideas/issues/708

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

Isuueに「HasWhereNotTraitを使うことでIssueを挙げた人の問題は解決できますよ〜」と書かれているけど、このスクラップの趣旨とはズレるのでこれはここまでにする。

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

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1072259885

大体のDBMSでどちらも使える(以下の記事ではMySQL、PostgreSQL、Oracleでは使えると書いている)。

https://style.potepan.com/articles/25913.html

普段使っているMySQLでも公式ドキュメントにどちらも使えることが明確に記載されている。

https://dev.mysql.com/doc/refman/8.0/ja/comparison-operators.html