2015-12-29 5 views
0

Мне нужно добавить конкатенированное поле в мое предложение SELECT, основанное на результатах моего предложения WHERE. Вот мой текущий запрос:SQL CASE в предложении SELECT

Declare 
@Low numeric(13,0) = 10000, 
@High numeric(13,0) = 100000000000, 
@Name varchar(100) = '%', 
@Stname varchar(100) = '%georgia', 
@Sumlev varchar(3) = 1, 
@County varchar(30) = 123456, 
@Place varchar (5) = 8, 
@Gid2 varchar(5), 
@Gid2_1 varchar (7); 

if object_id('tempdb..#GeoID2') is not null drop table #GeoID2 

SELECT 
    SUMLEV, State, County, Place, Name, Stname, ESTIMATESBASE2010, CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 3 - LEN(COUNTY)) + COUNTY) AS Gid2 
INTO 
    #GeoID2 
FROM 
    [CensusData].[dbo].[SUB-EST2014_ALL] 
WHERE 
    (NOT (SUMLEV = @Sumlev)) AND (NOT (County = @County)) AND (NOT (PLACE = @Place)) AND 
       (ESTIMATESBASE2010 > @Low) AND (ESTIMATESBASE2010 < @High) AND (Name LIKE @Name) and (Stname LIKE @Stname) 

SELECT 
    [#GeoID2].SUMLEV, [#GeoID2].State, [#GeoID2].County, [#GeoID2].Place, [#GeoID2].Stname, [#GeoID2].Name, [#GeoID2].ESTIMATESBASE2010, [ACS_14_5YR_S1901_with_ann].[HC01_EST_VC13] as Avg_Salary, [#GeoID2].Gid2, [#GeoID2].Gid21 
FROM 
    [CensusData].[dbo].[#GeoID2] INNER JOIN 
    [CensusData].[dbo].[ACS_14_5YR_S1901_with_ann] ON [CensusData].[dbo].[#GeoID2].Gid2 = [CensusData].[dbo].[ACS_14_5YR_S1901_with_ann].[GEO id2] 
ORDER BY 
    [#GeoID2].NAME 

Мне нужно добавить саз к моему первому ЗЕЬЕСТА, чтобы присвоить значение Gid2. Текущее значение присваивается как:

CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 3 - LEN(COUNTY)) + COUNTY) AS Gid2 

Что мне нужно сделать, это проверить значение [County], прежде чем я присвоит это значение. Исходя из этого результата, я буду использовать одну из двух формул. Вот что я пытался (это не работает):

Case 
    When (County = 0) 
    Then 'CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 5 - LEN(PLACE)) + PLACE) AS Gid2' 
    Else 'CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 3 - LEN(COUNTY)) + COUNTY) AS Gid2' 
End 

Я не уверен, что с помощью СЛУЧАЙ правильный путь, но я не могу понять, какой-либо другой способ подойти к этому. Может кто-нибудь помочь?

+1

Начнем с того, в вашем случае заявлении„ как Gid2“должен прийти после того, как„конец“ –

+1

FWIW, я думаю, что использовать оператор CASE для этого можно. –

+0

Брайан - хорошая точка на «как Gid2», я переместил его после «end», но я все еще получаю сообщение об ошибке: неправильный синтаксис около «0», – gacto

ответ

0

Хорошо, я понял. . Я использовал "перед моей функции Concat, когда я использую (Вот рабочий запрос:

Declare 
@Low numeric(13,0) = 10000, 
@High numeric(13,0) = 100000000000, 
@Name varchar(100) = '%', 
@Stname varchar(100) = '%georgia', 
@Sumlev varchar(3) = 1, 
@County varchar(30) = 123456, 
@Place varchar (5) = 8, 
@Gid2 varchar(5), 
@Gid2_1 varchar (7); 

if object_id('tempdb..#GeoID2') is not null drop table #GeoID2 

SELECT 
SUMLEV, State, County, Place, Name, Stname, ESTIMATESBASE2010, 

Case 
    When (County = 0) 
    Then (CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 5 - LEN(PLACE)) + PLACE)) 
    Else (CONCAT(REPLICATE('0', 2 - LEN(STATE)) + STATE, REPLICATE('0', 3 - LEN(COUNTY)) + COUNTY)) 
End AS Gid2 

INTO 
    #GeoID2 

FROM 
    [CensusData].[dbo].[SUB-EST2014_ALL] 

WHERE 
    (NOT (SUMLEV = @Sumlev)) AND (NOT (County = @County)) AND (NOT (PLACE = @Place)) AND 
       (ESTIMATESBASE2010 > @Low) AND (ESTIMATESBASE2010 < @High) AND (Name LIKE @Name) and (Stname LIKE @Stname) 

SELECT 
    [#GeoID2].SUMLEV, [#GeoID2].State, [#GeoID2].County, [#GeoID2].Place, [#GeoID2].Stname, [#GeoID2].Name, [#GeoID2].ESTIMATESBASE2010, [ACS_14_5YR_S1901_with_ann].[HC01_EST_VC13] as Avg_Salary, [#GeoID2].Gid2 

FROM 
    [CensusData].[dbo].[#GeoID2] INNER JOIN 
    [CensusData].[dbo].[ACS_14_5YR_S1901_with_ann] ON [CensusData].[dbo].[#GeoID2].Gid2 = [CensusData].[dbo].[ACS_14_5YR_S1901_with_ann].[GEO id2] 

ORDER BY 
    [#GeoID2].NAME 
+0

Очень приятно! Когда у вас появится шанс принять свой собственный ответ, пожалуйста, сделайте это. Это приведет к закрытию вашего вопроса. – zedfoxus

Смежные вопросы