Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Sqlite 3 CASE语句语法错误_Sqlite_Haskell_Triggers_Case - Fatal编程技术网

Haskell Sqlite 3 CASE语句语法错误

Haskell Sqlite 3 CASE语句语法错误,sqlite,haskell,triggers,case,Sqlite,Haskell,Triggers,Case,这是HDBC和Sqlite3。它说“CASE”附近有一个语法错误。但我找不到这样的。有吗 CalculateNofStockStraded::String->Database.HDBC.Sqlite3.Connection->IO() CalculateNofStockstraded代码conn=do run conn " CREATE TRIGGER calcStocks \

这是HDBC和Sqlite3。它说“CASE”附近有一个语法错误。但我找不到这样的。有吗

CalculateNofStockStraded::String->Database.HDBC.Sqlite3.Connection->IO() CalculateNofStockstraded代码conn=do

                                run conn " CREATE TRIGGER calcStocks \
                                           \ AFTER INSERT ON historicalData \
                                           \ FOR EACH ROW \
                                           \ BEGIN \
                                           \ CASE WHEN (SELECT COUNT(*) FROM historicalData) >= 1  THEN \
                                           \    UPDATE company \
                                           \    SET noOfStocks=(SELECT SUM(volume) FROM historicalData  WHERE companyCode= ? ) \
                                           \    WHERE code= ? ; \
                                           \ ELSE \
                                           \    UPDATE company \
                                           \    SET noOfStocks=0  \
                                           \    WHERE code= ? ; \
                                           \ END \

                                           \ END; " [toSql code,toSql code, toSql code]

                                commit conn
由于触发器的主体是
更新stmt
插入stmt
删除stmt
选择stmt
中的一个;因此,我们需要根据其中一个方面重写触发器

事实证明,您可以简化触发器,这样我们就可以不用任何东西来替换
大小写
语法;如果
count(foo.*)<1
,则必须是
sum(foo.bar)=0
,因此:

在sqlite中<代码>计数(foo.*<1
,导致
总和(foo.bar)为空
,这是不幸的;但是我们可以通过使用
coalesce()
null
转换为
0
,使它做正确的事情:


第一次运行时,historicalData表中没有元组。这就是问题所在。然后它说“SqlNull”不能被转换等等。
CREATE TRIGGER calcStocks
AFTER INSERT ON historicalData
FOR EACH ROW
BEGIN
   UPDATE company
   SET noOfStocks=(SELECT COALESCE(SUM(volume), 0) FROM historicalData  WHERE companyCode= ? )
   WHERE code= ? ;
END