В отличие от языков программирования, таких как C, C #, Java и т. Д., В SQL нет так называемых условных логических операторов. Для условных логических операторов правый операнд оценивается только в том случае, если он может повлиять на результат. Таким образом, оценка &&
останавливается, если левый операнд возвращает false. Для ||
он останавливается, если левый операнд возвращает true.
В SQL оба операнда всегда вычисляются. И оптимизатор запросов должен выбрать, какой из них будет оценен первым.
Я предлагаю вам создать следующую функцию, которая полезна во многих случаях:
FUNCTION IS_NUMBER(P_NUMBER VARCHAR2)
RETURN NUMBER DETERMINISTIC
IS
X NUMBER;
BEGIN
X := TO_NUMBER(P_NUMBER);
RETURN X;
EXCEPTION
WHEN OTHERS THEN RETURN NULL;
END IS_NUMBER;
Тогда вы можете переписать ваш запрос как:
SELECT COUNT(*) FROM TAB WHERE B = 0 AND IS_NUMBER(A) = 123;
Вы также можете использовать функцию, чтобы проверить, является ли строка числом.