Тип a -> Integer
на самом деле не означает «функцию от любого типа до Integer
», как вы ее описываете. Когда определение или выражение имеет тип a -> Integer
, это означает, что для любого типа T
можно специализировать или создавать экземпляр этого определения или выражения в функции типа T -> Integer
.
Слегка переключая нотацию, можно подумать, что foo :: forall a. a -> Integer
действительно является функцией двух аргументов: типа a
и значения этого типа a
. Или, с точки зрения карри, foo :: forall a. a -> Integer
- это функция, которая принимает тип T
в качестве аргумента и производит для этого специализированную функцию типа T -> Integer
T
. Используя функцию тождества в качестве примера (функция, которая создает свой аргумент в качестве своего результата), мы можем продемонстрировать это следующим образом:
-- | The polymorphic identity function (not valid Haskell!)
id :: forall a. a -> a
id = \t -> \(x :: t) -> x
Эта идея реализации полиморфизма как аргумента типа для полиморфной функции исходит из математическая структура, называемая System F , которую Хаскелл фактически использует в качестве одного из своих теоретических источников. Однако Haskell полностью скрывает идею передачи параметров типа в качестве аргументов функциям.
Конечно
UPDATE table SET inuse=IF(id=ABCD, 1, 0)
установит для поля inuse значение 1, если id равно ABCD, и 0 в противном случае.
Я не знаю лучших , но вы можете посмотреть Ragel :
Ragel компилирует исполняемые конечные автоматы из обычных языков. Ragel нацелен на C, C ++, Objective-C, D, Java и Ruby.
UPDATE myTable
SET Field = 0
WHERE FieldID <> [WhateverID]
UPDATE myTable
SET Field = 1
WHERE FieldId = [WhateverID]
Попробуйте
update tbl set inuse = if(test, 1, 0);
или короче
update tbl set inuse = test;
, например
update tbl set inuse = name = 'foo';
Если вы хотите установить флаг, то никакая другая часть кода не использует тот же объект одновременно время, лучше, если вызывающий код устанавливает inuse = 1 и сбрасывает его по завершении. В противном случае вы закончите один поток, чтобы пометить объект (строку) как используемый, а затем, если другому потоку понадобится другой объект, он сбросит первый, пока еще используется.
Если это не так, и вы просто хотите иметь возможность установить inuse для одного и сбросить все остальные, вы можете использовать:
UPDATE myTable
SET InUse = CASE
WHEN myTable.id = @id THEN 1
ELSE 0
END
если ваша база данных использует транзакции, это лучший способ сделать это:
update myTable set inuse = 0;
update myTable set inuse = 1 where id = ?;
если вы не используете транзакции, то другой вариант ответа с использованием CASE - лучший вариант, поскольку он переносится. но для этого потребуется больше процессорного времени, чем для двух операторов UPDATE.