Вы можете использовать values()
конструкцию & amp; сделайте 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
, то вы должны иметь один промежуточный стол и усилитель; делать 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;
TL; DR
Заключать в кавычки только переменную, а не весь ожидаемый путь с подстановочным знаком
rm "$archivedir"/*.bz2
Объяснение
В Unix программы, как правило, не интерпретируют подстановочные знаки сами. Оболочка интерпретирует подстановочные знаки без кавычек и заменяет каждый аргумент с подстановочными знаками списком совпадающих имен файлов.
если $ archivedir может содержать пробелы, то rm $ archivedir / *. bz2
может не выполнять то, что вы
Вы можете отключить этот процесс, заключая в кавычки символ подстановки, используя двойные или одинарные кавычки или обратную косую черту перед Это. Однако здесь это не то, что вам нужно - вы хотите, чтобы подстановочный знак был расширен до списка файлов, которые ему соответствуют.
Будьте осторожны при написании rm $ archivedir / *. Bz2
(без кавычек). Разделение слов (то есть разбиение командной строки на аргументы) происходит после замены $ archivedir. Поэтому, если $ archivedir содержит пробелы, вы получите дополнительные аргументы, которые вы не намеревались. Скажем, archivedir - это / var / архивы / ежемесячно / с апреля по июнь
. Тогда вы получите эквивалент написания rm / var / archives / month / April / June / *. Bz2
, который пытается удалить файлы "/ var / archives / month / April", "to" и все файлы, соответствующие "June / *. bz2", что не то, что вам нужно.
Правильное решение - написать :
rm "$archivedir"/*.bz2
Ваша исходная строка
rm "$archivedir/*.bz2"
может быть переписана как
rm "$archivedir"/*.bz2
для достижения того же эффекта. Расширение подстановочного знака не выполняется должным образом в вашей существующей установке. Сдвигая двойную кавычку в начало пути к файлу (что является допустимым), вы избегаете этого.
Просто, чтобы немного расширить это, bash имеет довольно сложные правила для работы с метасимволами в кавычках. В общем
почти ничего не интерпретируется в одинарных кавычках:
echo '$ foo / *. C' => $ foo / *. C
echo '\\ *' => \\ *
замена оболочки выполняется внутри двойных кавычек, но метасимволы файлов не раскрываются:
FOO = hello; echo "$ foo / *. c" => привет / *. c
все внутри обратных кавычек передается в подоболочку, которая их интерпретирует. Переменная оболочки, которая не экспортируется, не определяется в подоболочке. Итак, первая команда эхом пуста, а вторая и третья эхом "пока":
BAR = пока эхо `echo $ BAR`
Bar = свидания; echo `echo $ BAR`
экспорт BAR = пока; echo `echo $ BAR`
(И заставить его напечатать так, как вы хотите в SO , нужно несколько попыток , по-видимому, невозможно ...)
Кавычки приводят к тому, что строка интерпретируется как строковый литерал, попробуйте удалить их.