我想寫加入到TableA
另一TableB
如果TableA.Column1
查詢包含numeric
值和Join
到TableA
另一個TableC
如果TableA.Column1
包含varchar
值。加入兩個表只有第一個是包含特定的值,如果不加入另一個
有沒有辦法寫這樣的查詢?
我想寫加入到TableA
另一TableB
如果TableA.Column1
查詢包含numeric
值和Join
到TableA
另一個TableC
如果TableA.Column1
包含varchar
值。加入兩個表只有第一個是包含特定的值,如果不加入另一個
有沒有辦法寫這樣的查詢?
這樣的事情呢?您需要將適當的列投射到一些中間地帶。
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 @MikeCheel **'好邏輯.' ** – Luv
+1。我想我錯過了什麼,爲什麼WHERE 1 = 1? –
1 = 1僅僅是一個我用來讓我更容易擺弄我的WHERE過濾器的約定。 –
表設計聽起來有問題,但我認爲這個查詢是一個簡單的方法來實現你所要求的。
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子句中將它們排除在外。
根據JNK的評論,這裏有一種方法可以解決它,它至少試圖封裝設計問題,在表中添加2個計算列,代表INT
和VARCHAR
的佔位符鍵。
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;
(該NULL
映射具有過濾掉「不正確」的數據類型的影響通過在INNER JOIN
期間消除它們。)
這種糟糕的設計很糟糕,您可能要考慮將varchar和numeric值放入不同的列中。 – JNK
我很喜歡,只是它不是我的設計或我的創作,而是我們購買的產品,我有責任去處理它。 – SKGeek