先日、コードレビューをしていたら、SQLの不等式条件が != から <> に変更されているのを見かけた。どっちも合っているし、挙動は変わらないので特に指摘はしなかったのだが、モヤモヤしたので調べてみた。
結論から言うと、<> を使うのが適切。
ANSI SQL Standard
最新の仕様書は、ANSI の WebStore にて$200程度で購入可能。高くはないけど、この程度の調査で出す金額ではないな…。なんとかならんかなと、ウェブを回遊すると SQL1999 の仕様書を発見
P97 5.2 <token> and <separator> に <not equals operator> ::= <> という記述を発見。 ANSI SQL Standard では SQL不等式条件は <> と定義されている。つまり、それ以外の不等式条件は、RDBMS が許容してくれている方言ということになる。
各 RDBMS の対応
各バージョンの最新で調べました。
| RDBMS | Version | <> | != | ^= | メモ |
|---|---|---|---|---|---|
| MySQL | 8.0 | ◯ | ◯ | ✕ | |
| Postgres | 12.4 | ◯ | ◯ | ✕ | !=は構文解析時に<>に変換 |
| Oracle | 21c | ◯ | ◯ | ◯ | |
| SQL Server | 2019 | ◯ | ◯ | ✕ | |
| Sqlite | 3.35 | ◯ | ◯ | ✕ |
基本的に <> と != は使えるようです。変わり種としては、Oracle の ^= でしょうか。Stack Overflow で見かけた言説としては、 != はプログラミング言語で不等式条件として使われるので、 RDBMS はプログラマーに親和性が高い != の記述を受け入れるようにしたという意見がありました。
まとめ
SQL Standards に準拠して <> を使うというのが、もっともらしい言い訳です。ただし、 != も間違えではないので、あえて個別に修正をいれるほどのものでもない…とも思います。この辺は、コーディング規約で縛りを入れておくと、納得感が出るかもしれません。