9

Mysqlには、nullセーフである比較演算子<=>があります。次のようなプリペアドステートメントを作成するときに、Javaプログラムでこれを使用します。

String routerAddress = getSomeValue();
String sql = "SELECT * FROM ROUTERS WHERE ROUTER_ADDRESS <=> ? ";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, routerAddress);

次に、H2データベースに切り替えたいと思います。純粋なSQLで<=>演算子を作成するにはどうすればよいですか(たとえば、ISNULLおよびISNOT NULLを使用)?stmt.setString操作を1回だけ使用したいと思います。列名を数回書き込んでもかまいません。

関連する質問は、SQLでnull==nullを取得することです。しかし、その答えでは、検索値を2回書き込む必要があります(つまり、PreparedStatementに2つの疑問符があります)!?

参照: http ://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

4

5 に答える 5

8

SQLの標準のNULLセーフな等式演算子はとIS DISTINCT FROMですIS NOT DISTINCT FROM

于 2010-03-30T13:28:14.820 に答える
8

関連する質問は Get null == null in SQL です。しかし、その答えには、検索値を 2 回書き込む必要があります (つまり、PreparedStatement に疑問符が 2 つ)!?

2 番目以降の回答は、検索値を 2 回バインドせずにこれを行う方法を提供します。

SELECT * FROM ROUTERS 
WHERE coalesce(ROUTER_ADDRESS, '') = coalesce( ?, '');

これには、有効な列値になることのないダミー値が必要であることに注意してください (「範囲外」)。空文字列を使用しています。そのような値がない場合は、値を 2 回バインドする必要があります。

SELECT * FROM ROUTERS 
WHERE ROUTER_ADDRESS = ? or (ROUTER_ADDRESS is null and ? is null);
于 2009-04-29T14:38:09.783 に答える
2

SQL では、NULL はそれ自体と等しくありません。したがって、次のいずれかを実行できます。

1 - ダミーの値に置き換えて、次のように比較します。

SELECT * FROM ROUTERS WHERE ISNULL(ROUTER_ADDRESS,'xxx') <=> ISNULL(?,'xxx')

また

2 - 次のように、より精巧な論理テストに置き換えます。

SELECT *
FROM ROUTERS 
WHERE (
       (ROUTER_ADDRESS IS NULL AND ? IS NOT NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NOT NULL AND ROUTER_ADDRESS <> ?
      )
于 2009-04-29T14:47:29.060 に答える
0

ROUTER_ADDRESSがnullであるROUTERSが必要な場合は?nullの場合、おそらくこれは機能する可能性があります。

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
                             else ? end)
于 2009-04-29T15:05:30.360 に答える