Парсеры SQL просто интерпретируют IN как последовательность условий OR? - PullRequest
0 голосов
/ 25 декабря 2018

При написании SQL-запроса, такого как

SELECT ID, NAME FROM USER_TABLE WHERE ID IN (1, 2, 10, 14, 15, ..., n)

, парсер просто перефразирует это в это?

SELECT ID, NAME FROM USER_TABLE WHERE ID = 1 
                                      OR ID =  2 
                                      OR ID =  10
                                      OR ID =  14
                                      OR ID =  15 
                                      ...
                                      OR ID =  n

Или он делает что-то еще в фоновом режиме для эффективности?Хотя это кошмар, когда я пишу от руки, и я бы никогда не стал выступать за это, есть ли теоретическая выгода в производительности или удар по использованию IN, а не ряда условий ИЛИ, подобных этому?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

В соответствии со спецификациями ( SQL92, например, ), x IN (a, b, c) описывается как:

8.4  <in predicate>

[...]

4) The expression
     RVC IN IPV
   is equivalent to
     RVC = ANY IPV

И:

8.7  <quantified comparison predicate>

[...]

<quantified comparison predicate> ::=
     <row value constructor> <comp op> <quantifier> <table subquery>

<quantifier> ::= <all> | <some>

<all> ::= ALL

<some> ::= SOME | ANY

[...]

   c) If the implied <comparison predicate> is true for at least
     one row RT in T, then "R <comp op> <some> T" is true.

Последняя строка, кажется, предполагает, что x IN (a, b, c) должен обеспечивать такой же результат, как и x = a OR x = b OR x = c.Однако спецификации не определяют, как RDBM должны реализовывать поведение, оно может варьироваться в зависимости от RDBM.

В следующих постах содержатся некоторые интересные наблюдения:

SQL Server, по-видимому, генерирует такое же выполнениепланируйте x IN (...) и x = ... OR x = ..., где MySQL обрабатывает их по-разному.

0 голосов
/ 25 декабря 2018

Это зависит от базы данных.Логически, IN интерпретируется как последовательность OR s, но это не означает, что это базовая реализация.

Например, MySQL упорядочит список констант и использует двоичный поиск длянайти совпадение.Это сильно отличается от серии OR с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...