Mysql 在什么情况下使用concat,好还是坏? 一个简单的测验:
也许很多人都知道这一点 在我的应用程序中有一个查询,其中我在where条件下使用concat 在我的过程中,v_book_id和v_genre_id是两个变量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); 现在,我知道这里面有一个陷阱/错误,在你的一生中只会发生两次。你能告诉我是什么吗 我昨天发现了这一点,我想我应该对所有其他人练习这一点大吵大闹。 谢谢。让我们看
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;
在那里。第二个解决方案是
- 更快(最佳索引使用)
- 易于编写(代码更少)
- 更容易阅读(作者到底在想什么来连接数字??)
- 更正确(如问题评论中所述)。查看以下示例数据:
现在添加(或concat)book_id | genre_id 1 | 12 11 | 2
和v_book_id=1
,看看如何通过v_genre_id=12
concat()查询获得有趣的结果
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:很好,我没有看到那条评论。我会给你信任,我等着接受你的回答!!还有两分钟!!