Есть ли функция в sql server «isEmpty», возвращающая данные, если select возвращает пустой результирующий набор

#sql #sql-server #tsql

#sql #sql-server #tsql

Вопрос:

У меня есть таблица, подобная этой

 EmpId  No_of_days
  1       24
  2       28
  6       24
  7       30
  8       10
  9       15
  

когда я пишу оператор select

 SELECT No_of_days FROM _table WHERE EmpId = 3 or 4 or 5
  

Я получил пустой результирующий набор.

Я хочу, чтобы результирующий набор возвращал 0 дней для сотрудников 3, 4 и 5

Ответ №1:

Вы можете использовать values() construct amp; do left join :

 select tt.empid, isnull(t.No_of_days, 0)
from ( values (3), (4), (5) 
     ) tt (empid) left join
     table t
     on t.empid = tt.empid;
  

РЕДАКТИРОВАТЬ : Если у вас больше employee идентификаторов s, вам нужно поддерживать одну промежуточную таблицу и делать left join :

 select tt.empid,
       ISNULL(t.No_of_days, 0)
from table tt left join -- possible employee id table
     [_table] t
     on t.empid = tt.empid;
  

Комментарии:

1. это означает, что я сначала узнаю пустые идентификаторы? как это будет работать для тысяч записей? 3, 4 и 5 — это всего лишь пример, не существующий в реальном мире

Ответ №2:

Предполагая, что у вас есть другая таблица со всеми вашими сотрудниками (если нет, то откуда берутся сотрудники 3, 4 и 5?), вы могли бы использовать LEFT JOIN в вашем примере таблицы ( _table ):

 SELECT e.empid,
       ISNULL(t.No_of_days,0)
FROM Employee e --No idea what your employee table is actually called, so guessed.
     LEFT JOIN _table t ON e.empid = t.empid;
  

Это предоставит строки для всех ваших сотрудников. Если бы вы хотели только 3, 4 и 5, то вы бы добавили свой WHERE :

  WHERE e.empid IN (3,4,5)
  

Ответ №3:

используйте coalesce

    select coalesce(No_of_days,0) 
  from _table WHERE EmpId in( 3 , 4 , 5)
  

Кстати, используйте In вместо or , и если вам нужно ввести эти идентификаторы в EmpId 1-й, тогда
coalesce() будет работать в противном случае, если в empid нет значений, то это не будет работать

Комментарии:

1. Как это будет работать? Если нет строк для EmpID 3, 4 или 5, набор данных по-прежнему не вернет строк. OP ищет не общую совокупность, а совокупность для каждого empID .

2. это означает, что я сначала узнаю пустые идентификаторы? как это будет работать для тысяч записей? 3, 4 и 5 — это всего лишь пример, не существующий в реальном мире