IIF 函数从 SQL 到 HSQLDB
IIF Function from SQL to HSQLDB
我在 MS Access 中有以下 SQL 语句 -
WITH
qryAwayMatches AS (SELECT MATCHTEAM.FOOTBALLMATCHID, MATCHTEAM.TEAMID, MATCHTEAM.GAMETYPE, MATCHPROTOCOL.MATCHTEAMID, MATCHPROTOCOL.GOALNUMBER,
MATCHPROTOCOL.YELLOWCARDNUMBER, MATCHPROTOCOL.REDCARDNUMBER FROM MATCHTEAM LEFT JOIN MATCHPROTOCOL ON MATCHTEAM.ID = MATCHPROTOCOL.MATCHTEAMID WHERE (((MATCHTEAM.GAMETYPE)='Away'))),
qryHomeMatches AS (SELECT MATCHTEAM.FOOTBALLMATCHID, MATCHTEAM.TEAMID, MATCHTEAM.GAMETYPE, MATCHPROTOCOL.MATCHTEAMID, MATCHPROTOCOL.GOALNUMBER,
MATCHPROTOCOL.YELLOWCARDNUMBER, MATCHPROTOCOL.REDCARDNUMBER FROM MATCHTEAM LEFT JOIN MATCHPROTOCOL ON MATCHTEAM.ID = MATCHPROTOCOL.MATCHTEAMID WHERE (((MATCHTEAM.GAMETYPE)='Home'))),
qryMatchResult AS (SELECT qryHomeMatches.FootballMatchID, qryHomeMatches.TeamID AS HomeTeamID,
qryAwayMatches.TeamID AS AwayTeamID,
qryHomeMatches.GoalNumber>qryAwayMatches.GoalNumber AS HomeTeamWin,
qryHomeMatches.GoalNumber=qryAwayMatches.GoalNumber AS NoWin,
qryHomeMatches.GoalNumber<qryAwayMatches.GoalNumber AS AwayTeamWin
FROM qryHomeMatches INNER JOIN qryAwayMatches ON qryHomeMatches.FootballMatchID = qryAwayMatches.FootballMatchID)
SELECT Round.RoundNumber, Team.Name, **IIf([HomeTeamWin],3,IIf([NoWin],1,0)) AS Points**
FROM Round
INNER JOIN (Team INNER JOIN (RoundDetail INNER JOIN qryMatchResult ON RoundDetail.FootballMatchID = qryMatchResult.FootballMatchID) ON Team.ID = qryMatchResult.HomeTeamID) ON Round.ID = RoundDetail.RoundID;
当我尝试使用 HSQLDB 在 Java 中按下按钮时执行此语句时,出现以下错误:
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: IIF
我该如何解决这个问题?
从文档看来,HSQLDB 不支持 IIF 函数,我在函数列表中找不到它:
http://hsqldb.org/doc/2.0/guide/builtinfunctions-chapt.html#bfc_general_functions
不过好消息是:HSQLDB支持case表达式:
http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_query_expression
CASE
case specification
::= |
::= CASE ... [ ] END
::= CASE ... [ ]
END
::= WHEN THEN
::= WHEN THEN
::= ELSE
::= |
::= [ { }...
]
::= | | | | | | | | | | | |
::= | NULL
::=
case 表达式由 ANSII SQL 标准定义,大多数数据库都支持,而 IIF 函数是专有的和非标准的。
你可以改写:
iif ( condition, value_if_true, value_if_false )
以这种方式使用 case 表达式:
CASE WHEN condition THEN value_if_true ELSE value_if_false END
例如:
SELECT CASE WHEN col1>1 THEN 20 ELSE 50 END
FROM ....
而不是
SELECT iif(col1>1,20,50)
FROM ...
我在 MS Access 中有以下 SQL 语句 -
WITH
qryAwayMatches AS (SELECT MATCHTEAM.FOOTBALLMATCHID, MATCHTEAM.TEAMID, MATCHTEAM.GAMETYPE, MATCHPROTOCOL.MATCHTEAMID, MATCHPROTOCOL.GOALNUMBER,
MATCHPROTOCOL.YELLOWCARDNUMBER, MATCHPROTOCOL.REDCARDNUMBER FROM MATCHTEAM LEFT JOIN MATCHPROTOCOL ON MATCHTEAM.ID = MATCHPROTOCOL.MATCHTEAMID WHERE (((MATCHTEAM.GAMETYPE)='Away'))),
qryHomeMatches AS (SELECT MATCHTEAM.FOOTBALLMATCHID, MATCHTEAM.TEAMID, MATCHTEAM.GAMETYPE, MATCHPROTOCOL.MATCHTEAMID, MATCHPROTOCOL.GOALNUMBER,
MATCHPROTOCOL.YELLOWCARDNUMBER, MATCHPROTOCOL.REDCARDNUMBER FROM MATCHTEAM LEFT JOIN MATCHPROTOCOL ON MATCHTEAM.ID = MATCHPROTOCOL.MATCHTEAMID WHERE (((MATCHTEAM.GAMETYPE)='Home'))),
qryMatchResult AS (SELECT qryHomeMatches.FootballMatchID, qryHomeMatches.TeamID AS HomeTeamID,
qryAwayMatches.TeamID AS AwayTeamID,
qryHomeMatches.GoalNumber>qryAwayMatches.GoalNumber AS HomeTeamWin,
qryHomeMatches.GoalNumber=qryAwayMatches.GoalNumber AS NoWin,
qryHomeMatches.GoalNumber<qryAwayMatches.GoalNumber AS AwayTeamWin
FROM qryHomeMatches INNER JOIN qryAwayMatches ON qryHomeMatches.FootballMatchID = qryAwayMatches.FootballMatchID)
SELECT Round.RoundNumber, Team.Name, **IIf([HomeTeamWin],3,IIf([NoWin],1,0)) AS Points**
FROM Round
INNER JOIN (Team INNER JOIN (RoundDetail INNER JOIN qryMatchResult ON RoundDetail.FootballMatchID = qryMatchResult.FootballMatchID) ON Team.ID = qryMatchResult.HomeTeamID) ON Round.ID = RoundDetail.RoundID;
当我尝试使用 HSQLDB 在 Java 中按下按钮时执行此语句时,出现以下错误:
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: IIF
我该如何解决这个问题?
从文档看来,HSQLDB 不支持 IIF 函数,我在函数列表中找不到它:
http://hsqldb.org/doc/2.0/guide/builtinfunctions-chapt.html#bfc_general_functions
不过好消息是:HSQLDB支持case表达式:
http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_query_expression
CASE
case specification
::= |
::= CASE ... [ ] END
::= CASE ... [ ] END
::= WHEN THEN
::= WHEN THEN
::= ELSE
::= |
::= [ { }... ]
::= | | | | | | | | | | | |
::= | NULL
::=
case 表达式由 ANSII SQL 标准定义,大多数数据库都支持,而 IIF 函数是专有的和非标准的。
你可以改写:
iif ( condition, value_if_true, value_if_false )
以这种方式使用 case 表达式:
CASE WHEN condition THEN value_if_true ELSE value_if_false END
例如:
SELECT CASE WHEN col1>1 THEN 20 ELSE 50 END
FROM ....
而不是
SELECT iif(col1>1,20,50)
FROM ...