sql >> Databáze >  >> RDS >> Sqlserver

Převeďte výraz CASE v SQL na odvozený sloupec v SSIS

Morálka následujícího příběhu je taková, že jen proto, že můžete udělat něco v SSIS, není to vždy dobrý nápad.

Příkladem je tento dotaz. Bylo by mnohem efektivnější použít pro generování konečné hodnoty stávající logiku sql než použití odvozených sloupců nebo skriptové úlohy v SSIS (nemluvě o plýtvání pamětí potrubí, CPU atd.)

Zdrojový dotaz

Jako zdrojový dotaz jsem použil následující.

SELECT '50%' AS FixedARMRateReductionLimit, .1 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Weekly PMMS Rate' AS FixedARMRateReductionLimit, .3 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Frack',  .5

Najít procentuální pozici

Zjistěte, zda ve sloupci existuje symbol procent. Tím se vytvoří sloupec s názvem PercentPosition

FINDSTRING(FixedARMRateReductionLimit, "%",1)

Zkontrolujte text sazby

Mělo by stačit provést jednoduché srovnání, jak ukazuje první výraz, ale měl jsem s tím problémy. Předpokládám, že je to řetězcová konverze/porovnání problém (viz první poznámka). Spíše než se hrabat v získávání booleovské hodnoty jsem k vygenerování ordinální pozice použil řetězec findstring.

FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)

Odvození výstupu

Užijte si dvojí využití Ternární operátor .

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100

Něco z toho jste mohli zjednodušit v úloze skriptu, ale já bych jen udělal logiku ve zdrojovém kódu.



  1. Sloučení více řádků do jednoho řádku a připojení sloupců v závislosti na počtu řádků

  2. Jak funguje IIF() na serveru SQL Server

  3. Vyberte den v týdnu od data

  4. Chyba:nedefinovaná vlastnost $load