2013-06-27 21 views
2

我想寫加入到TableA另一TableB如果TableA.Column1查詢包含numeric值和JoinTableA另一個TableC如果TableA.Column1包含varchar值。加入兩個表只有第一個是包含特定的值,如果不加入另一個

有沒有辦法寫這樣的查詢?

+4

這種糟糕的設計很糟糕,您可能要考慮將varchar和numeric值放入不同的列中。 – JNK

+0

我很喜歡,只是它不是我的設計或我的創作,而是我們購買的產品,我有責任去處理它。 – SKGeek

回答

2

這樣的事情呢?您需要將適當的列投射到一些中間地帶。

SELECT * 
FROM TableA a 
INNER JOIN TableB b ON b.Columns1 = a.Column1 
    AND ISNUMERIC(a.Column1) = 1 
WHERE 1=1 
UNION 
SELECT * 
FROM TableA a 
INNER JOIN TableC c ON c.Columns1 = a.Column1 
    AND ISNUMERIC(a.Column1) = 0 
+1

+1 @MikeCheel **'好邏輯.' ** – Luv

+0

+1。我想我錯過了什麼,爲什麼WHERE 1 = 1? –

+0

1 = 1僅僅是一個我用來讓我更容易擺弄我的WHERE過濾器的約定。 –

1

表設計聽起來有問題,但我認爲這個查詢是一個簡單的方法來實現你所要求的。

SELECT 
    TableA.Column1, 
    TableB.Column2, 
    TableC.Column2, 
    ISNULL(TableB.Column2, TableC.Column2) 
FROM TableA 
LEFT OUTER JOIN TableB ON 
    ISNUMERIC(TableA.Column1) = 1 
    AND TableA.Column1 = TableB.Column1 
LEFT OUTER JOIN TableC ON 
    ISNUMERIC(TableA.Column1) = 0 
    AND TableA.Column1 = TableC.column1 

正如Mike Cheel指出的那樣,您可能需要進行一些鑄造。

另外,使用這種方法,您需要考慮TableA中有一條記錄與TableB或TableC中的任何內容不匹配的可能性,因爲這是使用外部連接。如果您不希望結果中包含這些記錄,則可以在WHERE子句中將它們排除在外。

1

根據JNK的評論,這裏有一種方法可以解決它,它至少試圖封裝設計問題,在表中添加2個計算列,代表INTVARCHAR的佔位符鍵。

ALTER TABLE MyTable ADD IntJoinColumn AS 
CASE WHEN ISNUMERIC(BadJoinColumn) = 1 
    THEN CAST(BadJoinColumn AS INT) 
    ELSE NULL 
END; 
ALTER TABLE MyTable ADD VarCharJoinColumn AS 
    CASE WHEN ISNUMERIC(BadJoinColumn) = 1 
      THEN NULL 
      ELSE BadJoinColumn 
    END; 

然後,可以加入更多的「可讀」的方式,如下所示:

SELECT mt.* 
    FROM MyTable mt 
    INNER JOIN MyIntJoinTable ON IntJoinColumn = MyIntJoinTable.Id 
UNION ALL 
SELECT mt.* 
    FROM MyTable mt 
INNER JOIN MyVarCharJoinTable ON VarCharJoinColumn = MyVarCharJoinTable.VarCharId; 

SQLFiddle Here

(該NULL映射具有過濾掉「不正確」的數據類型的影響通過在INNER JOIN期間消除它們。)

相關問題