Php 我可以在case语句中使用子查询吗?
我可以在case语句中使用子查询吗?这可能吗?Php 我可以在case语句中使用子查询吗?,php,sql,case,Php,Sql,Case,我可以在case语句中使用子查询吗?这可能吗? 这是我的密码: SELECT SUM(icd.discrepancy * ( CASE WHEN $priceVal = 1 THEN SELECT i.dPrice FROM item_tb i WHERE i.ID = icd.itemID ELSE SELECT p.dPrice FROM price_tb p WHERE p.brID = '". $brID ."' AND p.itemID =
这是我的密码:
SELECT SUM(icd.discrepancy * (
CASE WHEN $priceVal = 1
THEN SELECT i.dPrice FROM item_tb i
WHERE i.ID = icd.itemID
ELSE SELECT p.dPrice FROM price_tb p
WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID
END
)) as total
FROM invcountd_tb icd
WHERE icd.coID = '". $_SESSION['coID'] ."'
AND icd.invCounthID = '". $ID ."'
可以,但必须将子查询括在括号内,例如:
CASE WHEN $priceVal = 1 THEN (SELECT i.dPrice FROM item_tb i WHERE i.ID = icd.itemID)
ELSE (SELECT p.dPrice FROM price_tb p WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID)
END
但是,如果返回的行数超过一行,则仍可能出现错误是,但子查询需要放在括号中:
SELECT SUM(icd.discrepancy * (
CASE WHEN $priceVal = 1 THEN
(SELECT i.dPrice FROM item_tb i WHERE i.ID = icd.itemID)
ELSE
(SELECT p.dPrice FROM price_tb p WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID)
END
)) as total
FROM
invcountd_tb icd
WHERE
icd.coID = '". $_SESSION['coID'] ."'
AND
icd.invCounthID = '". $ID ."'
不过,我会将其改写如下:
SELECT SUM(icd.discrepancy * COALESCE(i.dPrice, p.dPrice))
FROM invcountd_tb icd
LEFT JOIN item_tb i
ON i.ID = icd.itemID
AND $priceVal = 1
LEFT JOIN price_tb p
ON p.brID = '". $brID ."'
AND p.itemID = icd.itemID
AND $priceVal <> 1
WHERE icd.coID = '". $_SESSION['coID'] ."'
AND icd.invCounthID = '". $ID ."'
选择总和(icd差异*合并(i.dPrice,p.dPrice))
来自invcountd_tb icd
左连接项_tb i
ON i.ID=icd.itemID
和$priceVal=1
左连接价格
关于p.brID=“$brID.”
p.itemID=icd.itemID
和$priceVal 1
其中icd.coID='“$\u会话['coID']””
icd.invCounthID=“$ID.”
您的连接条件将为您执行case语句(即,如果$priceVal=1
,则只返回i.dPrice
,如果$priceVal 1
,则只返回p.dPrice
。这避免了在MySQL中优化不当的昂贵子查询
要回答您的问题,是的,您可以在Case语句中有一个子查询
此外,在上面的查询中,我认为您还存在另一个问题,即您正在对包含子查询的表达式执行聚合,这会产生错误。由于转义错误,您将得到语法错误。您尝试过吗?结果如何,是否出现错误,如果是,您的查询会出现什么错误…错误。MYSQL错误:您您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解在第4行的“SELECT i.dPrice FROM item_tb i WHERE i.ID=icd.itemID ELSE SELEC”附近使用的正确语法,但在他的查询中,这种情况在SUM中,这将给他提供“无法对包含聚合或子查询的表达式执行聚合函数。”