2012-04-06 9 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 ')'と書いて 'OR'を使わずにそのクリーナーを実行できます。 –

+0

=、そしてエラーがありました、%sのように切り替わりました、私のエラーを見つけ出し、%を削除しましたが、決して=に戻しませんでした。あなたはすべてのアカウントの上にありますよ、ありがとう。 :) –

答えて

4

私は問題は、各行に1つの値を割り当てるだけで、他の変数は同時に上書きしないことです。 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

あなたは私が探していたものです。私はあなたの名前をthoのように見えることができません。ありがとうございました! –

+0

@JamesWilsonあなたは大歓迎です...私はスペースを外さなければならないと思います... '@ MichaelFredrickson'。 –

+0

私はそれを試みました。通常は '@ M'を実行すると、それがあなたであることを確認するためのリストをポップアップします。しかし、何もポップアップすることはなく、私が '@ MichaelFredrickson'を行うときでさえ、@MichaelFredricksonは投稿を提出するとそれは消える。ああ、まあ、少なくとも、それはまだあなたのコメントを警告します。 :) –

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

結果をループして変数を割り当てます。

+0

この方法ではうまくいきましたが、SQLのすべてを処理しようとしていました。答えに感謝します。 –

4

それは

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のようなことについて聞いたこともありません。あなたの答えをありがとう。 –

+0

+1 'PIVOT'をうまく利用しています... –

+0

@Jamesマイケルのバージョン(ハッキーじゃないから)に行くべきですが、とにかくPIVOTに試してみてください。互換性レベルは新しい構文をブロックしません。 –

0
を動作するように骨材の使用を必要とするので、あなたはこれを行うにはPIVOTを使用しますが、その少しハックすることができます

別のアプローチとして、たとえばcompany_settingsという表を作成して、、'CompanyActivityEmail'などの値を持つSettingの単一列を作成することができます。

次に、あなたが行うことができます:

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); 
関連する問題