MS SQL Server Выберите количество строк равно нулю, мне нужно вернуть значение - PullRequest
0 голосов
/ 01 июля 2019

У меня есть этот запрос.

 SELECT ISNULL(x.lastLogin,0) AS lastLogin
 FROM
 (
      SELECT u.id,u.lastLogin,u.isAdmin,row_number() 
      OVER(PARTITION BY u.clientid ORDER BY u.lastLogin DESC) AS rownumber 
      FROM users u 
      WHERE (u.isAdmin = -1 AND u.clientid = xxx) AND u.userid Not IN 
      (
         SELECT userID
         FROM Table1
         WHERE groupID = 
             (SELECT groupID FROM Table2
                 WHERE clientid = xxx
                   AND groupName = 'Group 1')
      )
  )x
 WHERE x.rownumber = 1

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

Значения, которые можно извлечь из подзапроса, являются действительной датой, равными нулю, если дата не указана и строка не возвращена. Когда я использую текущий запрос, я получу правильную дату, если она существует, 1900-01-01, если она пуста, но когда возвращается ноль строк, я не могу получить значение, с которым я могу что-то сделать. Я просто получаю заголовок столбца lastlogin, а не значение. Как мне получить набор значений?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Так я решил свою проблему. Таким образом, значение объединения может быть только сверху, когда нет других строк.

 SELECT TOP 1 ISNULL(x.lastLogin,0) AS lastLogin
 FROM
 (
  SELECT u.id,u.lastLogin,u.isAdmin,row_number() 
  OVER(PARTITION BY u.clientid ORDER BY u.lastLogin DESC) AS rownumber 
  FROM users u 
  WHERE (u.isAdmin = -1 AND u.clientid = xxx) AND u.userid Not IN 
  (
     SELECT userID
     FROM Table1
     WHERE groupID = 
         (SELECT groupID FROM Table2
             WHERE clientid = xxx
               AND groupName = 'Group 1')
  )
  UNION ALL
  SELECT '',5
  )x
0 голосов
/ 01 июля 2019

Переместите логику WHERE в предложение select и выполните условное агрегирование:

SELECT
    CASE WHEN COUNT(x.lastLogin) = 1 AND x.rownumber = 1
         THEN x.lastLogin
         ELSE GETDATE() END AS lastLogin
FROM
( ... ) x
GROUP BY
    x.lastLogin;

Примечание: я не вижу смысла в вызове ISNULL на lastLogin, поскольку, если счет равен 1, то lastLogin не может быть NULL.

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