2012-01-20 2 views
2

Как я должен идти о делать что-то вроде:SQL Select проверка личных данных условие

ЕСЛИ следующий выбор имеет какие-либо строки

SELECT ID, NAME FROM TABLE WHERE [email protected] 

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

Я использую somwthing как

IF EXISTS(SELECT ID, NAME FROM TABLE WHERE [email protected]) 
    SELECT ID, NAME FROM TABLE WHERE [email protected] 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 

но таким образом я использую первый выберите дважды (один раз в чеке и после фактического набора возврата записи.

+0

Действительно ли идентификатор идентифицирует строку в 'TABLE'? Является ли условие «ELSE» выбранным из одной таблицы (если это так, оно всегда будет оцениваться как 0)? –

ответ

2

Это не так неэффективно, как вы ключевое слово EXISTS означает, что оптимизатор останавливается после обнаружения 1 записи.

Но, если вы действительно хотите избежать повторения, вы можете сделать что-то вроде ...

SELECT ID, NAME FROM TABLE WHERE [email protected] 

IF (@@rowcount = 0) 
    SELECT QTY FROM TABLE WHERE [email protected] 

Проблема заключается в том, что теперь вы возвращаете клиенту до 2 наборов записей. Первый из которых будет пустым (но заголовки полей и т. Д. Все еще возвращаются - только с 0 записями).

Вы можете избежать этого, вставив результаты в переменную таблицы и только вернув их клиенту, если есть записи. Но я думаю, что это будет заметно медленнее, чем просто использование EXISTS(), как вы уже это делали.

+0

Форма обоих наборов результатов в любом случае различна, поэтому нет смысла пытаться их объединить. Я собирался опубликовать это одно и то же. –

+0

Я не согласен: 'EXISTS' не инструктирует оптимизатора делать что-либо конкретное, как« остановка после обнаружения 1 записи »(что, очевидно, невозможно с учетом пустого набора :) – onedaywhen

+0

@onedaywhen - все SQL является выражением логики на более высоком уровне абстракции, чем на самом деле выполняется. EXISTS() является синтаксисом для '0 записей, равных false, больше равно true '.Оптимизатор SQL Server достаточно эффективен, что он завершает выполнение, если какая-либо запись когда-либо обнаруживается при предоставлении результатов в рамках операции EXISTS(). Короче говоря, я не согласен с вашим несоответствием;) – MatBailie

2
DECLARE @ID INT, 
     @NAME VARCHAR(50); 

SELECT @ID = ID, 
     @NAME = NAME 
FROM TABLE WHERE [email protected]; 

IF(@@ROWCOUNT = 1) 
    SELECT @ID AS ID, @NAME AS NAME 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 
+0

Хорошо, если первый выбор гарантированно вернется не более одной строки, но не будет работать так, как написано на данный момент. Вам также нужно назначить 'Name' переменной. И тогда есть условная логика для выбора переменных или другого выбора. А также это синтаксис MySQL ... –

+0

Относительно MySQL: BUSTED! (Но я предполагал, что это универсальный). Пожалуйста, не стесняйтесь редактировать синтаксис. Что касается рабочего процесса: если первый запрос НЕ возвращает никаких строк, второй будет. Oups! Просто s/<>/= в IF –

+0

Я взял на себя право редактировать его для работы в SQL Server. Не стесняйтесь откатываться, конечно, если я искал ваши намерения. –

Смежные вопросы