Haskell Sqlite 3 CASE语句语法错误
这是HDBC和Sqlite3。它说“CASE”附近有一个语法错误。但我找不到这样的。有吗 CalculateNofStockStraded::String->Database.HDBC.Sqlite3.Connection->IO() CalculateNofStockstraded代码conn=doHaskell 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 \
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