在任何条件下使用concat,好还是坏?

时间:2012-05-09 09:11:13

标签: mysql where-clause concat

一个简单的测验:

可能很多人以前都知道这个,

在我的应用程序中有一个查询,其中我使用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);

现在,我知道这里有一个问题/错误,在你的一生中只会发生两次。你能告诉我它是什么吗?

我昨天发现了这一点,并认为我应该对所有其他人都这样做吵闹。

感谢。

1 个答案:

答案 0 :(得分: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;

有。第二个解决方案是

  • 更快(最佳索引使用)
  • 更容易编写(代码更少)
  • 更容易阅读(作者想要连接数字的原因是什么?)
  • 更正确(Alnitak也在问题的评论中说明)。看看这个样本数据:

    book_id | genre_id
    1       | 12
    11      |  2
    

    现在添加(或concat)v_book_id = 1v_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))