2012-04-06 52 views
2

我有我正在尋找一個表中的特定信息,這個查詢將顯示它:我試圖用sql來做什麼?

SELECT StringValue FROM ClientSettings 
WHERE Setting like 'CompanyDomain' 
OR Setting like 'CompanyActivityEmail' 
OR Setting like 'CompanySupportPhone' 
OR Setting like 'CompanyName' 

它返回以下日期:

StringValue 
MyCompanyName 
[email protected] 
www.mycompanydomain.com 
801-555-1212 

我想現在設置這些達變量而不必做出4個獨立的選擇語句。

這裏是我有什麼,但它不工作,我希望它:

DECLARE @CompanyName VARCHAR(100) 
DECLARE @CompanyDomain VARCHAR(100) 
SELECT @CompanyName = StringValue, @CompanyDomain = StringValue FROM ClientSettings 
WHERE Setting like 'CompanyName' 
OR Setting like 'CompanyDomain' 

SELECT @CompanyName 
SELECT @CompanyDomain 

我很好奇,如果我所想,甚至有可能?

+0

只是注意:如果你正在做一個'LIKE「SomeText''沒有任何通配符,你不妨做=。另外,如果你正在做'Setting ='CompanyName'OR Setting ='ComanyDomain'',你可以通過編寫'Setting IN('CompanyName','CompanyDomain')''' – 2012-04-06 17:24:52

+0

' =,並且出現錯誤,將它切換爲與%一樣,找出我的錯誤,刪除了%,但從未將它切換回=。你對所有的事都是正確的,謝謝。 :) – 2012-04-06 17:26:50

回答

4

我認爲問題是您應該只爲每行分配一個值,但不能同時覆蓋其他變量。一個CASE聲明應該讓你這樣做:

DECLARE @CompanyName VARCHAR(100) 
DECLARE @CompanyDomain VARCHAR(100) 

SELECT 
    @CompanyName = CASE WHEN Setting = 'CompanyName' 
     THEN StringValue ELSE @CompanyName END, 
    @CompanyDomain = CASE WHEN Setting = 'CompanyDomain' 
     THEN StringValue ELSE @CompanyDomain END 
FROM ClientSettings 
WHERE Setting like 'CompanyName' 
OR Setting like 'CompanyDomain' 

SELECT @CompanyName 
SELECT @CompanyDomain 
+0

你是男人,正是我所尋找的。我似乎永遠不會(以)你的名字壽。再次感謝你! – 2012-04-06 17:20:23

+0

@JamesWilson不客氣......我想你只是不得不離開空間......'@ MichaelFredrickson'。 – 2012-04-06 17:22:22

+0

我試過了。通常當我做'@ M'時,它會彈出一個列表來驗證它是你。但是沒有任何東西會彈出來,即使當我提交帖子時,@ MichaelFredrickson @MichaelFredrickson也會消失。哦,好吧,至少它仍然會提醒你評論。 :) – 2012-04-06 17:25:12

1
SELECT setting, StringValue 
FROM ClientSettings 
WHERE Setting in ('CompanyDomain' 
        ,'CompanyActivityEmail' 
        ,'CompanySupportPhone' 
        ,'CompanyName') 

然後循環結果並分配您的變量。

+0

這種方式本來是有效的,只是試圖處理SQL中的所有內容,謝謝你的答案。 – 2012-04-06 17:20:52

4

您可以使用PIVOT要做到這一點,但它有點哈克,因爲它需要使用一個總的工作

DECLARE @CompanyName VARCHAR(100) 
DECLARE @CompanyDomain VARCHAR(100) 

SELECT @CompanyName = [CompanyName], 
     @CompanyDomain = [CompanyDomain] 
FROM (SELECT setting, 
       stringvalue 
     FROM clientsettings 
     WHERE setting LIKE 'CompanyName' 
       OR setting LIKE 'CompanyDomain') AS sourcetable PIVOT (MAX( 
     stringvalue 
     ) FOR setting IN ([CompanyName], [CompanyDomain])) AS pivottable 

SELECT @CompanyName, 
     @CompanyDomain 

Working demo

+0

我確定這樣做會起作用,但數據庫的兼容級別太低。我從來沒有聽說過像PIVOT這樣的一些東西。謝謝您的回答。 – 2012-04-06 17:23:04

+0

+1好用的'PIVOT' ... – 2012-04-06 17:23:09

+0

@詹姆斯你應該與邁克爾的版本(因爲它不是哈克),但你應該試試PIVOT一試。兼容性級別不會阻止新的語法。 – 2012-04-06 17:28:43

0

作爲一種替代方法,您可以創建一個名爲company_settings的表格,其單列Setting的值爲'CompanyDomain','CompanyActivityEmail'等。

然後,你可以這樣做:

SELECT StringValue FROM ClientSettings 
WHERE Setting is in (select Setting from company_settings); 

或者乾脆:

SELECT StringValue 
FROM ClientSettings a 
JOIN company_settings b 
ON (a.Setting=b.Setting); 
相關問題