1

簡単なクイズ:

おそらく多くの人が以前にこれを知っています、

私のアプリでは、このような条件でconcatを使用しているクエリがあります。

v_book_idとv_genre_idは、私のプロシージャの2つの変数です。

SELECT link_id 
FROM link
WHERE concat(book_id,genre_id) = concat(v_book_id,v_genre_id);

さて、これにはキャッチ/バグがあることを私は知っています。これはあなたの生涯で2回だけ発生します。何を教えてもらえますか?

私は昨日これを見つけて、これを実践している他のすべての人について騒ぐべきだと思いました。

ありがとう。

4

1 に答える 1

3

みてみましょう

WHERE concat(book_id,genre_id) = concat(v_book_id,v_genre_id);

とは対照的に

WHERE book_id = v_book_id AND genre_id = v_genre_id;

三。2番目の解決策は

  • より高速(最適なインデックスの使用)
  • 書きやすい(コードが少ない)
  • 読みやすい(著者は数字を連結しようと考えていたのは一体何だったのか???)
  • より正確です(Alnitakも質問のコメントで述べているように)。このサンプルデータを確認してください。

    book_id | genre_id
    1       | 12
    11      |  2
    

    次に、追加(または連結)v_book_id = 1して、クエリv_genre_id = 12で面白い結果が得られる方法を確認しますconcat()

一部のデータベース(MySQLを含む)ではタプルの操作が許可されています。これは、上記の巧妙な作成者が実際に意図したことである可能性があります。

WHERE (book_id, genre_id) = (v_book_id, v_genre_id);

このようなタプル述語の実例:

SELECT * FROM (
  SELECT 1 x, 2 y FROM DUAL UNION ALL
  SELECT 1 x, 3 y FROM DUAL UNION ALL
  SELECT 1 x, 2 y FROM DUAL 
) a
WHERE (x, y) = (1, 2)

一部のデータベースでは、右側のタプルの前後に追加の括弧が必要になることに注意してください。((1, 2))

于 2012-05-09T09:15:14.677 に答える