2013-08-28 42 views
0

我自動化Excel和我有我從片作爲Variable1,2,3,4,5,6可選變量

讀取輸入我希望讓他們可選的,如果他們的字符串留空執行查詢像往常一樣

SELECT LEFT(Name, 5) 
    FROM Production.Product 
    where 
    product.name like 'Variable1' 
    product.brand like 'Variable2' 
    prodcut.price > 'Variable3' 
    prodcut.expirydate > 'Variable4' 
    ORDER BY ProductID; 

回答

0

嘗試是這樣的:

SELECT LEFT(Name, 5) 
FROM Production.Product 
WHERE 
(Product.name like @Variable1 or @Variable1 IS NULL) AND 
(Product.brand like @Variable2 or @Variable2 IS NULL) AND 
(Product.price > @Variable3 or @Variable3 IS NULL) AND 
(Product.expirydate > @Variable4 or @Variable4 IS NULL) 
ORDER BY ProductID; 
+0

一句話。在這種情況下,操作順序非常重要。由於第一部分評估並始終返回true,所以第二部分不再被評估,並且LIKE(類似於變量1或變量1 IS NULL的產品名稱)不等於(變量1爲空或產品。名稱類似於變量1)如果數據庫足夠大,則成本較高/運行緩慢,因此不應該首先進行評估 – Skorpioh

+1

Skorpioh;不以我的經驗,儘管我使用SQL Server,這可能與MySQL或Oracle稍有不同。 –

+0

感謝您的提示,你是對的。我只是在MSSQL中檢查,它比我想象的更聰明,並且以任何方式得到它:) – Skorpioh

0

下面的查詢應該做的伎倆:

SELECT LEFT(Name, 5) 
FROM Production.Product 
WHERE 
    ('Variable1' = '' OR product.name LIKE 'Variable1') AND 
    ('Variable2' = '' OR product.brand LIKE 'Variable2') AND 
    ('Variable3' = '' OR prodcut.price > 'Variable3') AND 
    ('Variable4' = '' OR prodcut.expirydate > 'Variable4') 
ORDER BY ProductID; 

但是您的查詢看起來不太健康ATM。一個可能對MySQL和MSSQL運行會是什麼樣子:

SELECT LEFT(Name, 5) 
FROM Production.Product 
WHERE 
    (@Variable1 = '' OR product.name LIKE @Variable1) AND 
    (@Variable2 = '' OR product.brand LIKE @Variable2) AND 
    (@Variable3 = '' OR prodcut.price > @Variable3) AND 
    (@Variable4 = '' OR @Variable4 IS NULL OR prodcut.expirydate > @Variable4) 
ORDER BY ProductID; 

不過,你首先要決定其仍可更改查詢變量的數據類型,你還必須添加「*」和/或'%'通配符到你正在拋出的字符串,否則它沒有多大意義,'='會更快。

希望這會有所幫助。

乾杯

+0

如果'@ Variable'是'NULL'怎麼辦?畢竟,'NULL'>'''。 –

+0

你是部分權利 - @Variable可能會或可能不會爲空。在這種情況下,這些變量來自excel,所以它可能不會爲空。我還提到where子句可能會根據類型聲明而改變,因此如果變量被聲明爲NOT NULL,那麼說<>''就足夠了;否則它需要空以及空檢查。 – Skorpioh