Вычислить максимум двух значений в Transact-SQL - PullRequest
0 голосов
/ 03 апреля 2019

Я бы хотел выбрать объекты на основе параметра, если он больше определенной даты:

select o.* from objects as o 
where o.modifieddate >= max(<Search Term>,20190401)

Я получил ошибку:

Microsoft OLE DB Provider for SQL Server [-2147527900]
The max function requires 1 argument(s)

Какой синтаксис для этого подходит?

Это выбор Enterprise Architect Sparx (который должен быть выбором SQL Server). «» - это ключевое слово, чтобы получить значение, введенное пользователем в окне запроса. И это строка.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Вы можете использовать оператор CASE:

declare @InputDate datetime;
declare @CriteriumDate datetime;

set @InputDate = convert(datetime, '<Search Term>',103);
set @CriteriumDate =  = convert(datetime, '1/04/2019',103);

select o.* from objects as o 
where o.modifieddate >= case when @InputDate < @CriteriumDate then @CriteriumDate else @InputDate end;

(я ввел некоторые переменные даты, чтобы сделать запрос более читабельным.)

Редактировать:

As @ lvr123указал, что использование операторов CASE становится уродливым, когда нужно проверять несколько значений.Если версия SQL Server допускает это, в этом случае может использоваться следующий запрос:

declare @InputDate datetime;
declare @Criteria table (dt datetime);

insert into @Criteria (dt) values (convert(datetime, '<Search Term 1>',103));
insert into @Criteria (dt) values (convert(datetime, '<Search Term 2>',103));
insert into @Criteria (dt) values (convert(datetime, '1/04/2019',103));

select o.* from objects as o 
where o.modifieddate >= (select max(dt) from @Criteria);

Этот код, конечно, может быть несколько оптимизирован.И этот пример жестко запрограммирован с тремя значениями.Добавление дополнительных значений требует только добавления дополнительных INSERT-запросов к таблице @Criteria.

0 голосов
/ 03 апреля 2019

Вам придется поиграть с заполнением списка VALUES, но что-то вроде этого может работать и для вас:

SELECT
  o.*
FROM
  objects AS o
WHERE
  o.modifieddate >=
    (
      SELECT
        MAX(v.Criteria)
      FROM
        (
          VALUES
            (<SearchTerm_1>)
            ...
           ,(<SearchTerm_N>)
           ,(20190401) --<-- Your Default Value
        ) AS v (Criteria)
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...