2014-02-09 65 views
0

大家好,我需要做一個搜索,告訴用戶,要麼使按名稱搜索,或價格搜索用SQL語句和OR操作

SELECT   
    BID.BiddingPrice, BID.Date, Item.Name 
FROM    
    BID 
INNER JOIN 
    Buyer ON BID.BuyerID = Buyer.BuyerID 
INNER JOIN 
    Member ON Buyer.MemberID = Member.MemberID 
INNER JOIN 
    Auction ON BID.AuctionID = Auction.AuctionID 
INNER JOIN 
    Item ON Auction.ItemID = Item.ItemID 
WHERE   
    (Auction.Status = 'Expired') 
    AND (BID.Date BETWEEN @from AND @to) 
    OR (BID.Status = 'Available') 
    OR (Member.Username = @username) 
    OR (BID.BiddingPrice = @price) 
    OR (Item.Name = @name) 

回答

0

我強調我認爲需要改變實現你正在尋找的結果。您需要傳遞價格或名稱的值,具體取決於用戶提供的內容以及其他值的NULL值。例如,name ='Ron',price = NULL。

SELECT  BID.BiddingPrice, BID.Date, Item.Name 
FROM   BID INNER JOIN 
        Buyer ON BID.BuyerID = Buyer.BuyerID INNER JOIN 
        Member ON Buyer.MemberID = Member.MemberID INNER JOIN 
        Auction ON BID.AuctionID = Auction.AuctionID INNER JOIN 
        Item ON Auction.ItemID = Item.ItemID 
WHERE  (Auction.Status = 'Expired') AND (BID.Date BETWEEN @from AND @to) **AND** 
        (BID.Status = 'Available') **AND** 
        (Member.Username = @username) **AND** 
        **CASE WHEN @Price IS NOT NULL THEN 
         (BID.BiddingPrice = @price) ELSE 
         (Item.Name = @name) 
        END** 
0
SELECT BID.BiddingPrice, BID.Date, Item.Name 
FROM BID 
INNER JOIN Buyer ON BID.BuyerID = Buyer.BuyerID 
INNER JOIN Member ON Buyer.MemberID = Member.MemberID 
INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID 
INNER JOIN Item ON Auction.ItemID = Item.ItemID 
WHERE   
Auction.Status = 'Expired' 
AND (BID.Date BETWEEN @from AND @to) 
OR BID.Status = 'Available' 
OR Member.Username = @username 
OR(
    (Item.Name = @name OR @name is null) 
OR (BID.BiddingPrice = @price OR @price is null) 
) 

在情況下,如果任何@parameter可以爲空,那麼你應該創建你的where子句,如:

WHERE   
    Auction.Status = 'Expired' 
    AND (BID.Date>= @from OR @from is null) 
    AND (BID.Date<= @to OR @to IS NULL) 
    OR BID.Status = 'Available' 
    OR (Member.Username = @username OR @username is null) 
    OR(
     (Item.Name = @name OR @name is null) 
    OR (BID.BiddingPrice = @price OR @price is null) 
    ) 
+0

對不起,我在我的問題中犯了一個錯誤,即使沒有提供某些值,也要進行搜索 – user3287068

+0

我被編輯了更多空參數的答案 –

+0

您確定它即使用戶沒有提供有些價值? – user3287068

0

雖然這可以在靜態查詢通過巧妙地進行「開啓和關閉「WHERE子句的部分(如其他答案所示),請小心這樣做的潛在性能影響 - DBMS可能無法生成最佳查詢計劃。

這是其中dynamic SQL可能更合適的場合之一。使用動態SQL並不意味着你應該停止使用綁定參數!