简单的问题。想知道长 IN 子句是否是一种代码味道?我真的不知道如何证明它。除了我认为的那样,我不知道为什么它会闻起来。
select
name,
code,
capital,
population,
flower,
bird
from us_states
Ở đâu
code in
('NJ', 'NY', 'PA', 'CA', 'AL', 'AK', 'AZ',
'IL', 'IN', 'KY', 'KS', 'DC', 'MD', 'MA')
数据库通常如何实现这样的查找?是否制作并加入了临时表?或者它只是扩展为一系列逻辑或?
感觉应该是join...
我并不是说所有 IN 子句都不好。有时你忍不住。但在某些情况下(尤其是时间越长),您要匹配的元素集实际上来自某个地方。难道不应该加入吗?
是否值得创建(通过应用程序级别)一个临时表,其中包含您要搜索的所有元素,然后对其进行真正的连接?
select u.*
from us_states u
join #chosen_states t
on u.code = t.code
我认为这是一种代码味道。一方面,数据库对 IN
子句中允许的元素数量有限制,如果您的 SQL 是动态生成的,您最终可能会遇到这些限制。
当列表开始变长时,我会转换为使用带有临时表的存储过程,以避免出现任何错误。
我怀疑性能是一个主要问题,IN
子句非常快,因为它们可以短路,这与 NOT IN
子句不同。
Tôi là một lập trình viên xuất sắc, rất giỏi!