Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以在case语句中使用子查询吗?_Php_Sql_Case - Fatal编程技术网

Php 我可以在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 =

我可以在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 = 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中,这将给他提供“无法对包含聚合或子查询的表达式执行聚合函数。”