數據庫結構返回所有行是否連接表不包含任何行,否則返回唯一匹配的行
CREATE TABLE SalesOrder
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Reference NVARCHAR(50) NOT NULL DEFAULT '',
CustomerID INT NOT NULL DEFAULT 0
);
CREATE NONCLUSTERED INDEX IX_SalesOrder_CustomerID ON SalesOrder (CustomerID);
CREATE TABLE Customer
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name NVARCHAR(50) NOT NULL DEFAULT ''
);
實施例:SQL Fiddle
表值可變@SelectedCustomers
可以是由選定的客戶的ID
的空或包含列表用戶。如果選擇列表爲空
SELECT so.ID
, so.Reference
, c.Name AS CustomerName
FROM SalesOrder so
INNER JOIN Customer c ON c.ID = so.CustomerID
WHERE so.CustomerID IN (SELECT ID FROM @SelectedCustomers)
但我需要返回所有行,如果變量爲空
我試過OR
關鍵字,但這種方法是不是指數
選定的客戶該查詢返回的訂單,並且沒有返回友好和查詢變得非常緩慢。
目前我生成應用程序的代碼(.NET
)查詢。
如果列表中包含一些值,然後
WHERE so.CustomerID IN (SELECT ID FROM @SelectedCustomers)
條款添加到查詢
問題:是否存在以獲得所需結果更有效的方式一些其他的方式?
一種方法是使用if-else。檢查從@SelectedCustomers計數(*)是否0,然後使用where子句查詢,否則使用不帶where子句的查詢。您可能需要自己進行基準測試 – whereisSQL
爲什麼您需要在單個SQL查詢中執行此操作?難道你不能在調用代碼中檢查變量,並且如果變量爲空則執行一個sql語句,如果變量不是則執行另一個不同的查詢? – John
這正是我現在正在做的(我在問題中提到過) - 在應用程序(調用)代碼 – Fabio