Mysql 在什么情况下使用concat,好还是坏? 一个简单的测验:

Mysql 在什么情况下使用concat,好还是坏? 一个简单的测验:,mysql,where-clause,concat,Mysql,Where Clause,Concat,也许很多人都知道这一点 在我的应用程序中有一个查询,其中我在where条件下使用concat 在我的过程中,v_book_id和v_genre_id是两个变量 SELECT link_id FROM link WHERE concat(book_id,genre_id) = concat(v_book_id,v_genre_id); 现在,我知道这里面有一个陷阱/错误,在你的一生中只会发生两次。你能告诉我是什么吗 我昨天发现了这一点,我想我应该对所有其他人练习这一点大吵大闹。 谢谢。让我们看

也许很多人都知道这一点

在我的应用程序中有一个查询,其中我在where条件下使用concat

在我的过程中,v_book_id和v_genre_id是两个变量

SELECT link_id 
FROM link
WHERE concat(book_id,genre_id) = concat(v_book_id,v_genre_id);
现在,我知道这里面有一个陷阱/错误,在你的一生中只会发生两次。你能告诉我是什么吗

我昨天发现了这一点,我想我应该对所有其他人练习这一点大吵大闹。

谢谢。

让我们看看

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;
在那里。第二个解决方案是

  • 更快(最佳索引使用)
  • 易于编写(代码更少)
  • 更容易阅读(作者到底在想什么来连接数字??)
  • 更正确(如问题评论中所述)。查看以下示例数据:

    book_id | genre_id
    1       | 12
    11      |  2
    
    现在添加(或concat)
    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))

当然对索引没有帮助。如果
book\u id
的尾随字符也可以显示为
genre\u id
的前导字符,则组合的“键”不保证唯一。如果你选择了一种愚蠢的方式来生成一个据说是唯一的密钥,那你就更傻了。@Alnitak:我在一个有数百个查询使用这个方法的地方工作。我是新来的。我现在必须把它们全部换掉。“如果白痴能飞,这个地方就是机场!!!”同意Alnitak的观点,例如:使用concat无法区分以下记录1。图书id=2。类型id=22,concat=222;2.图书编号=22。类型id=2,concat=222@贾:那么我想你会更同意卢卡斯的观点……没错,这更正确。“如果book_id的尾随字符也可以显示为流派_id的主角,那么组合的“键”不一定是唯一的。更愚蠢的是,你选择了一种愚蠢的方式来生成一个假定唯一的键。”。。Kudo to Alnitak.是的,最后一点就是我在“问题”中的评论。@Alnitak:很好,我没有看到那条评论。我会给你信任,我等着接受你的回答!!还有两分钟!!