2016-07-24 74 views
0

我必須從兩個條件的表或視圖查詢。我可以與如果條件,但在我的情況下它必須在一個查詢中重複它,用於選擇表的SQL案例

像一個過程,正在接收標誌@reportType int

SELECT 
    a, b, c, d, e, f, g, h,... and so many 
FROM 
    CASE 
     WHEN @reportType = 1 
      THEN table 
      ELSE View 
    END 
INNER JOIN 
    and so on.. 

我需要寫像上面卻是拋出一個錯誤關鍵字

附近有語法錯誤「CASE」

+0

AFAIK,case表達式返回一個值,而不是標識符。它不能這樣做,只能使用動態sql或if ... else條件。 –

+0

我編輯了你的問題,你可以回滾;)。 –

+0

相同:[從兩個表中選擇](http://stackoverflow.com/questions/36857438/select-from-either-of-two-tables/36860365) –

回答

1

在您的存儲過程,你需要給我們E中的if語句來代替:

if @reportType=1 
    SELECT a,b,c FROM myTable 
else 
    SELECT a,b,c FROM myView 
+0

是的,但在我的情況下SELECT a,b ,c將會是相同的,但是myTable和myView將是有條件的,並且查詢太長而不能被spiting。 –

+0

然後我只能想到兩個選擇。 1)使用動態SQL(將查詢文本分配給'varchar'並執行它)。或者2)用兩個表的內容創建一個視圖,並在'where'中添加一個條件來過濾相應的表。 – Andrew

+0

我覺得我應該去爲IF條件,因爲這兩種方式會很費時感謝 –

1

其實這看起來並不像一個很好的設計,但如果你有這個工作,並希望避免複製過去的,你可以嘗試用最後的工會或一個子查詢條件的CTE與工會模仿單一來源的最終查詢:

;with Source_1 as 
(
    select ... 
    from myTable 
    where @reportType=1 
), 
Source_2 as 
(
    select ... 
    from myView 
    where @reportType=2 
), 
FullSource 
(
    select ... 
    from Source_1 
    union all 
    select ... 
    from Source_2 
) 
select ... 
from FullSource src 
inner join ... 

select ... 
from 
(
    select ... 
    from myTable 
    where @reportType = 1 

    union all 

    select ... 
    from myView 
    where @reportType = 2 
) src 
inner join ... 

注意,不同的可能流混淆查詢優化和驗證碼不利於性能。對於一些更好的執行計劃,您可能需要啓用recompile選項。

0

您可以使用動態SQL如下:

DECLARE @reportType INT 
SET @reportType = 1 

DECLARE @q VARCHAR(max)= 'SELECT 
a, b, c, d, e, f, g, h,... and so many 
FROM '+ 
CASE 
    WHEN @reportType = 1 
     THEN 'table ' 
     ELSE 'View ' 
END+' 
INNER JOIN 
and so on..' 

EXEC(@q) 

您可能還需要以使查詢參數,並防止可能的SQL注入使用sp_executesql的。

0

我認爲你需要這樣的查詢:

;WITH mixedData AS (
    SELECT yourFields, 1 As reportType 
    FROM yourTable 
    UNION ALL 
    SELECT yourFields, 2 AS reportType 
    FROM yourView 
) 
SELECT * 
FROM mixedData 
INNER JOIN yourJoinParams 
WHERE mixedData.reportType = @reportType; 

... 
WHERE mixedData.reportType = 
     CASE WHEN @reportType = 1 THEN 1 ELSE 2 END; 

注意yourFieldsyourTableyourView相同。

HTH