usar a capitalização quando na instrução SQL

tenho de mostrar informação comparando dados em duas colunas ID, uma coluna tem 'todos' e números como IDs, enquanto a outra tem apenas números como IDS. o meu problema é que não consigo comparar caracteres e colunas de números com uma coluna de números. Então estou a usar o CASE quando.

Se o valor for 'ALL' então mostra 'ALL' na saída, caso contrário mostra o nome para os registos correspondentes.

Aqui está o código:

CASE
  WHEN secorg.org_id = 'ALL' THEN 'ALL'
  WHEN secorg.org_id = progmap.org_id THEN secorg.org_name
END AS org_name,

a condição é esta: 'secorg. org_id = progmap. org_id' que é baseado no id e eu tenho que mostrar secorg.org_ nome se os id são os mesmos.

Aqui está toda a consulta:

SELECT distinct program_id,
                prog_name,
                case
                  when Eitc_Active_Switch = '1' then 'ON'
                  when Eitc_Active_Switch = '0'then 'OFF'
                End as Prog_Status,
                progmap.client_id,
                case
                  when secorg.org_id = 'ALL' then 'ALL'
                  --when secorg.org_id = progmap.org_id then secorg.org_name
                  else secorg.org_name
                end as org_name,
                case
                  when prog.has_post_calc_screen = 'True' then 'True'
                  Else 'False'
                End as Referal_ID,
                case
                  when progmap.program_ID IN ( 'AMC1931', 'AMCABD', 'AMCMNMI',
                                               'AMC' )
                       And sec.calwinexists_ind = '1' then 'Yes'
                  when progmap.program_ID IN ( 'AMC1931', 'AMCABD', 'AMCMNMI',
                                               'AMC' )
                       And sec.calwinexists_ind = '0'then 'No'
                  when progmap.program_ID NOT IN (
                       'AMC1931', 'AMCABD', 'AMCMNMI', 'AMC' ) then
                  'N/A'
                End as calwin_interface,
                sec.Client_name
FROM   ref_programs prog (nolock)
       LEFT OUTER JOIN ref_county_program_map progmap (nolock)
         ON progmap.program_id = prog.prog_id
            AND progmap.CLIENT_ID = prog.CLIENT_ID
       INNER join sec_clients sec (nolock)
         on sec.client_id = progmap.Client_id
       Inner join sec_organization secorg (nolock)
         on secorg.org_id = progmap.org_id  
Author: userstackoverflow, 2011-04-22

2 answers

Porque não lançar as colunas numéricas para as colunas varchar?

Se está a usar o servidor SQL, pode fazer isso assim:

CONVERT(VARCHAR,secorg.org_id) = CONVERT(VARCHAR,progmap.org_id)

Você terá que fazer uma junção externa para os casos em que a coluna que é tanto 'tudo' e números é 'tudo', pois não será capaz de se juntar interior à outra mesa.

Para a correcção rápida com base no seu código acima, você pode apenas alterar a segunda cláusula de quando para parecer assim (mais uma vez assumindo que está a usar o servidor de MS SQL):

WHEN CONVERT(VARCHAR,secorg.org_id) = CONVERT(VARCHAR,progmap.org_id) THEN secorg.org_name

Tenta isto como teu pesquisa:

SELECT DISTINCT 
    program_id, 
    prog_name,
    CASE Eitc_Active_Switch
        WHEN '1' THEN 'ON'
        ELSE 'OFF'
    END AS Prog_Status,
    progmap.client_id,
    ISNULL(secorg.org_name,'ALL') AS org_name,
    CASE prog.has_post_calc_screen
        WHEN 'True' THEN 'True'
        ELSE 'False'
    END AS Referal_ID,
    CASE WHEN progmap.program_ID IN ('AMC1931','AMCABD','AMCMNMI','AMC') AND sec.calwinexists_ind = '1' THEN
        'Yes'
        WHEN progmap.program_ID IN ('AMC1931','AMCABD','AMCMNMI','AMC') AND sec.calwinexists_ind = '0' THEN
        'No'
        WHEN progmap.program_ID NOT IN ('AMC1931','AMCABD','AMCMNMI','AMC') THEN
        'N/A'
    END AS calwin_interface,
    sec.Client_name
FROM
    ref_programs prog (nolock)
LEFT OUTER JOIN ref_county_program_map progmap (nolock) ON progmap.program_id = prog.prog_id AND progmap.CLIENT_ID = prog.CLIENT_ID
INNER JOIN sec_clients sec (nolock) ON sec.client_id = progmap.Client_id
LEFT OUTER JOIN sec_organization secorg (nolock) ON CONVERT(VARCHAR,secorg.org_id) = CONVERT(VARCHAR,progmap.org_id)
 1
Author: Ryan, 2011-04-22 00:55:24

A instrução do caso está bem. o nome do campo é mau. deve ser

     END As org_name

Um nome multi-partes como secorg. org_name não vai funcionar

 1
Author: Conrad Frix, 2011-04-22 00:57:52