При проверке, существует ли запись, используйте EXISTS
/ NOT EXISTS
. COUNT()
будет фактически считать все строки, в то время как EXISTS
будет закорачивать в первом ряду, таким образом, это будет быстрее.
IF EXISTS (SELECT 'record this year' FROM [TABLE] T WHERE T.employee_Id = '$CurrentUserId Если вам нужно это в 1 SELECT
утверждении, вы можете использовать решение Дирендры.
AND T.CreatedOn > DATEADD(YEAR,-1,GETDATE()))
BEGIN
-- Do stuff if record this last year
END
ELSE
BEGIN
-- Do stuff if no record this last year
END
Если вам нужно это в 1 SELECT
утверждении, вы можете использовать решение Дирендры.
Согласно другим ответам, это прекрасно:
char c = '5';
int x = c - '0';
кроме того, для проверки ошибок, можно хотеть проверить, что isdigit (c) верен сначала. Обратите внимание, что Вы не можете полностью портативно сделать того же для букв, например:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
стандарт гарантирует, что символьные значения для цифр '0' к '9' непрерывны, но не делает гарантий других символов как буквы алфавита.
Вычтите '0' как это:
int i = c - '0';
Стандарт C гарантирует, что каждая цифра в диапазоне '0'..'9'
является одним большим, чем его предыдущая цифра (в разделе 5.2.1/3
из проект C99). Те же счета для C++.
Если по некоторому сумасшедшему совпадению Вы хотите преобразовать строка из символов к целому числу, можно сделать это также!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
теперь 1024. По-видимому atoi()
прекрасен, и что я сказал об этом ранее, только относится ко мне (на OS X (возможно (вставьте шутку Lisp здесь))). Я услышал, что это - макрос, который отображается примерно на следующий пример, который использует strtol()
, функция более общего назначения, чтобы сделать преобразование вместо этого:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
работы как это:
long strtol(const char *str, char **endptr, int base);
Это преобразовывает *str
в long
, рассматривая его, как будто это была основа base
число. Если **endptr
не является пустым, это содержит первый символ нецифры strtol()
найденный (но кто заботится об этом).
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
Если это - просто отдельный символ 0-9 в ASCII, то вычитание значение нулевого символа ASCII от значения ASCII должно хорошо работать.
, Если Вы хотите преобразовать большее число тогда, следующее сделает:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** не забывают проверять состояние (который должен быть 1, если бы оно работало в вышеупомянутом случае).
Paul.
char chVal = '5';
char chIndex;
if ((chVal >= '0') && (chVal <= '9')) {
chIndex = chVal - '0';
}
else
if ((chVal >= 'a') && (chVal <= 'z')) {
chIndex = chVal - 'a';
}
else
if ((chVal >= 'A') && (chVal <= 'Z')) {
chIndex = chVal - 'A';
}
else {
chIndex = -1; // Error value !!!
}
Вы бросили бы его к интервалу (или плавание или дважды или что когда-либо еще Вы хотите сделать с ним), и сохраните его в другой переменной.
Когда мне нужно сделать что-то подобное, я предварительно запекаю массив с нужными мне значениями.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Тогда преобразование несложно
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Это в основном подход, используемый многими реализациями библиотеки ctype. Вы можете легко адаптировать его для работы с шестнадцатеричными цифрами.