我试图用sql来做什么?

我试图用sql来做什么?

问题描述:

我有我正在寻找一个表中的特定信息,这个查询将显示它:我试图用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

我认为问题是您应该只为每行分配一个值,但不能同时覆盖其他变量。一个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

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

然后循环结果并分配您的变量。

+0

这种方式本来是有效的,只是试图处理SQL中的所有内容,谢谢你的答案。 – 2012-04-06 17:20:52

您可以使用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

作为一种替代方法,您可以创建一个名为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);