You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CASE条件计算商品总价时出现SQL语法错误,求排查解决

问题:MySQL CASE语句语法错误及商品总价计算逻辑实现

需求说明:当商品存在sale_price时,用sale_price * quantity计算总价;无sale_price时,用price_origin * quantity计算总价。

尝试使用CASE语句实现该逻辑时,出现如下语法错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') )AS products FROM users u JOIN cart_order c_o ON c_o.user_id = u' at line 11

相关代码:

const readUserCart = async userId => {
  const userCart = await myDataSource.query(
    `SELECT u.id AS userId, u.name AS userName,
    JSON_ARRAYAGG(
        JSON_OBJECT(
          'productName', p.name, 
          'quantity', c_o.quantity,
          'priceOrigin', REPLACE(p.price_origin, '.', ','),
          'salePrice', REPLACE(p.sale_price, '.', ','),
          'productThumbnail', t_i.default_img,
          'status', c_o.status,
          'price', CASE 
                  WHEN p.sale_price = null 
                  THEN REPLACE(p.price_origin * quantity, '.', ',') 
                  ELSE REPLACE(p.sale_price * quantity, '.', ',')
        )
      )AS products
    FROM users u
    JOIN cart_order c_o ON c_o.user_id = u.id
    JOIN products p ON p.id = c_o.product_id
    WHERE u.id = ?
    GROUP BY u.id`,
    [userId]
  );
  return userCart;
};

错误原因与修正方案

1. 直接语法错误

你的CASE语句没有用END闭合,MySQL要求每个CASE逻辑必须以END结尾,这是触发1064错误的核心原因。

2. NULL判断逻辑错误

MySQL中判断字段是否为NULL不能用=,必须使用IS NULL,否则条件永远不成立(因为NULL和任何值比较都返回UNKNOWN)。

3. 字段歧义问题

quantity字段没有指定表别名,显式指定c_o.quantity可以避免潜在的字段歧义问题。

修正后的完整代码:

const readUserCart = async userId => {
  const userCart = await myDataSource.query(
    `SELECT u.id AS userId, u.name AS userName,
    JSON_ARRAYAGG(
        JSON_OBJECT(
          'productName', p.name, 
          'quantity', c_o.quantity,
          'priceOrigin', REPLACE(p.price_origin, '.', ','),
          'salePrice', REPLACE(p.sale_price, '.', ','),
          'productThumbnail', t_i.default_img,
          'status', c_o.status,
          'price', CASE 
                  WHEN p.sale_price IS NULL 
                  THEN REPLACE(p.price_origin * c_o.quantity, '.', ',') 
                  ELSE REPLACE(p.sale_price * c_o.quantity, '.', ',')
                  END
        )
      )AS products
    FROM users u
    JOIN cart_order c_o ON c_o.user_id = u.id
    JOIN products p ON p.id = c_o.product_id
    WHERE u.id = ?
    GROUP BY u.id`,
    [userId]
  );
  return userCart;
};

更简洁的替代实现方式

可以使用COALESCE函数简化逻辑,该函数会返回传入参数中第一个非NULL的值,直接替代CASE语句,代码更简洁:

const readUserCart = async userId => {
  const userCart = await myDataSource.query(
    `SELECT u.id AS userId, u.name AS userName,
    JSON_ARRAYAGG(
        JSON_OBJECT(
          'productName', p.name, 
          'quantity', c_o.quantity,
          'priceOrigin', REPLACE(p.price_origin, '.', ','),
          'salePrice', REPLACE(p.sale_price, '.', ','),
          'productThumbnail', t_i.default_img,
          'status', c_o.status,
          'price', REPLACE(COALESCE(p.sale_price, p.price_origin) * c_o.quantity, '.', ',')
        )
      )AS products
    FROM users u
    JOIN cart_order c_o ON c_o.user_id = u.id
    JOIN products p ON p.id = c_o.product_id
    WHERE u.id = ?
    GROUP BY u.id`,
    [userId]
  );
  return userCart;
};

内容的提问来源于stack exchange,提问作者ggyoE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:01:05