2011-10-04 23 views
1

首先查詢子查詢中CASE subselecting時返回超過1個行時聲明

此查詢工作正常,發動機不抱怨

SELECT id 
FROM agencies 
WHERE id IN ((SELECT id FROM agencies)) 
ORDER BY id; 

第二個查詢

這一個不工作,發動機正在抱怨Subquery returns more than 1 row,當 - 根據我 - 我正在做同樣的事情@param_1 IS NULL

SELECT 
    @param_1 := NULL, 

SELECT id 
FROM agencies 
WHERE id IN (CASE WHEN @param_1 IS NULL THEN (SELECT id FROM agencies) ELSE 1 END) 
ORDER BY id; 

有沒有人看到爲什麼引擎在第一次查詢時沒有抱怨第二個查詢?

在此先感謝,

回答

3

CASE需要一個標量單值。不是一個記錄集。

SELECT id 
FROM agencies 
WHERE id IN (
     SELECT id FROM agencies WHERE @param_1 IS NULL 
     UNION ALL 
     SELECT 1 WHERE @param_1 IS NOT NULL 
     ) 
ORDER BY id; 

OR

SELECT id 
FROM agencies 
WHERE id IN (SELECT id FROM agencies) 
    AND @param_1 IS NULL 
UNION ALL 
SELECT id 
FROM agencies 
WHERE @param_1 IS NOT NULL AND id = 1 
ORDER BY id; 

另一種選擇是使用IF

IF @param_1 IS NULL 
    SELECT id 
    FROM agencies 
    WHERE id IN (SELECT id FROM agencies) 
    ORDER BY id; 
ELSE 
    SELECT id 
    FROM agencies 
    WHERE id = 1 
    ORDER BY id; 
+0

啊通過11秒打我!至少我很好,我們有相同的答案哈哈。 – Curt

0

更改爲:

SELECT id 
FROM agencies 
WHERE id IN (
       SELECT id 
       FROM agencies 
       WHERE @param_1 IS NULL 

       UNION ALL 

       SELECT 1 as id 
       WHERE @param_1 IS NOT NULL 
) 
ORDER BY id; 
+0

UNION ALL會更好,因爲它是一個二元選擇。當然這對優化器來說可能並不重要,但它不會傷害 – gbn

+0

乾杯@gbn沒有想到這一點! – Curt

相關問題