Приоритет логического оператора SQL: и и или

Руководство относится к очень простому механизму, которые позволяют процессам или операционной системе уведомлять другие процессы путем отправки сигнала. Операционная система может использовать его, чтобы уведомить программы о прерываниях их (сигнал SIGABRT) или об отказе сегментации (часто вызываемый путем доступа к нулевому указателю, SIGSEGV), назвать двух из них.

Некоторые сигналы использования серверов Unix, таким образом, администратор может использовать kill, чтобы отправить им сигнал, заставляя их перечитать их конфигурационный файл, не требуя, чтобы они перезапустили.

существуют меры по умолчанию, принятые для некоторых сигналов, и другие сигналы просто проигнорированы. Например, на получают SIGSEGV, программа завершается при получении SIGCHLD, означать, что дочерний процесс умер, будет результатом по умолчанию ни в чем специальном.

существует ANSI C стандартная функция, которая устанавливает обработчик сигналов, который является функцией, которая может выполнить некоторый код при получении сигнала, названного signal (чтение в man signal). В различном Unix та функция ведет себя отличающаяся, таким образом, ее использованию препятствуют. Его страница справочника относится к sigaction функция (читайте man sigaction), который ведет себя последовательный, и также более мощен.

164
задан Tanner 18 February 2015 в 14:42
поделиться

2 ответа

И имеет приоритет над или , поэтому, даже если a <=> a1 или a2

Where a And b 

не то же самое, что

Where a1 Or a2 And b,

, потому что это будет Выполнено как

Where a1 Or (a2 And b)

, и то, что вы хотите, чтобы сделать их одинаковыми, это следующее (с использованием скобок для отмены правил приоритета):

 Where (a1 Or a2) And b

Вот пример для иллюстрации:

Declare @x tinyInt = 1
Declare @y tinyInt = 0
Declare @z tinyInt = 0

Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- outputs T
Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F

Для тех кому нравится обращаться к ссылкам (в алфавитном порядке):

268
ответ дан 23 November 2019 в 21:13
поделиться

Я добавлю 2 пункта:

  • «IN» - это, по сути, последовательное ИЛИ с круглыми скобками вокруг них
  • И имеет приоритет над ИЛИ на всех языках, которые я знаю

Итак, 2 выражения просто не равны.

WHERE some_col in (1,2,3,4,5) AND some_other_expr
--to the optimiser is this
WHERE
     (
     some_col = 1 OR
     some_col = 2 OR 
     some_col = 3 OR 
     some_col = 4 OR 
     some_col = 5
     )
     AND
     some_other_expr

Итак, когда вы разбиваете предложение IN, вы разделяете последовательные OR и меняете приоритет.

32
ответ дан 23 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: