在MySQL查询中使用IF不起作用-语法问题

在MySQL查询中使用IF不起作用-语法问题,mysql,sql,Mysql,Sql,这是我的问题$sess是一个会话变量,它是一个帐号。这就是问题发生的地方:IF(toAcct=$sess,amount,'-'.amount)作为amount 如果“to”帐户=会话变量帐户编号,我希望金额字段为正。如果“to”帐户是会话变量帐户号,我希望在金额前有一个-符号。我只是不确定语法应该是什么 SELECT transID, toAcct, fromAcct, IF(toAcct = $sess, amount, '-'.amount) as amount, `descripti

这是我的问题$sess是一个会话变量,它是一个帐号。这就是问题发生的地方:IF(toAcct=$sess,amount,'-'.amount)作为amount

如果“to”帐户=会话变量帐户编号,我希望金额字段为正。如果“to”帐户是会话变量帐户号,我希望在金额前有一个-符号。我只是不确定语法应该是什么

SELECT transID, toAcct, fromAcct, 
  IF(toAcct = $sess, amount, '-'.amount) as amount, `description`, 
  `timestamp`, 
  IF(toAcct = $sess, toAcctNewBalance, fromAcctNewBalance) AS balance 
FROM transactions 
WHERE transactions.toAcct = $ACCT or transactions.fromAcct = $ACCT 
ORDER BY transactions.timestamp DESC
非常感谢大家!PHP不是我的主要语言

这是您的代码:

SELECT transID, toAcct, fromAcct, amount, `description`, `timestamp`,
       IF(toAcct = $sess, [toAcctNewBalance], [fromAcctNewBalance]) AS balance
FROM transactions
WHERE transactions.toAcct = $ACCT or transactions.fromAcct = $ACCT
ORDER BY transactions.timestamp DESC;
首先,您使用的是
if()
,它是一个函数,而不是一个语句。有一个很大的区别(见下文)。无论如何,问题在于方括号。试试这个:

SELECT transID, toAcct, fromAcct, amount, `description`, `timestamp`,
       IF(toAcct = $sess, toAcctNewBalance, fromAcctNewBalance) AS balance
FROM transactions
WHERE $ACCT IN (transactions.toAcct, transactions.fromAcct)
ORDER BY transactions.timestamp DESC;
我还简化了
的WHERE

至于术语。是只允许在编程块中使用的控制流构造。也就是说,在
BEGIN
s和
END
s之间的代码中,通常在存储过程、函数和触发器中

IF()
函数就是您正在使用的函数。这允许在查询中使用条件逻辑。我更喜欢使用
大小写
表达式,因为这是标准SQL:

       (CASE WHEN toAcct = $sess THEN toAcctNewBalance ELSE fromAcctNewBalance
        END) AS balance

如果
amount
始终为正数,则使用以下方法:

IF(toAcct = $sess, amount, -amount)
如果可能是阴性,那么:

IF(toAcct = $sess, abs(amount), -abs(amount))

我就是这样让它工作的:

SELECT   transID, toAcct, fromAcct, 
         IF(toAcct = $sess, amount, -amount) as amount, 
         `description`, timestamp, 
         IF(toAcct = $sess, toAcctNewBalance, fromAcctNewBalance) AS balance 
FROM     transactions 
WHERE    transactions.toAcct = $ACCT OR transactions.fromAcct = $ACCT 
ORDER BY transactions.timestamp DESC;

$sess
是一个数字吗?
$ACCT
?如果这是MySql,请删除方括号。使用
大小写
而不是
如果
内选择
子句。@Dai,为什么?没有理由不在一个简单的条件下使用
IF
函数。@danblack对不起,我想到的是SQL Server(虽然在T-SQL中有
IIF(x,y,z)
)。