sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter CASE-udtryk i SQL til afledt kolonne i SSIS

Moralen i den følgende historie er, at bare fordi du kan gøre noget i SSIS, det er ikke altid en god idé.

Eksempelvis denne forespørgsel. Det ville være langt mere effektivt at bruge den eksisterende sql-logik til at generere den endelige værdi end at bruge afledte kolonner eller en scriptopgave i SSIS (for ikke at nævne spild af pipelinehukommelse, CPU osv.)

Kildeforespørgsel

Jeg brugte følgende som en kildeforespørgsel.

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
 

Find procentposition

Bestem, om der findes et procentsymbol i kolonnen. Dette opretter en kolonne kaldet PercentPosition

FINDSTRING(FixedARMRateReductionLimit, "%",1)
 

Se efter pristekst

Det burde være tilstrækkeligt at lave en simpel sammenligning, som det første udtryk viser, men jeg havde problemer med det. Jeg antager, at det er en strengkonvertering/sammenligning problem (se første note). I stedet for at knokle med at få en boolesk værdi, brugte jeg findstring til at generere ordenspositionen.

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

Udled output

Nyd den dobbelte brug af Ternary operator .

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

Du kunne have forenklet noget af dette i en scriptopgave, men jeg ville bare gøre logikken i kilden.



  1. make MySQL-serveren har skrivetilladelser i mappen \xampp\tmp

  2. Forøg ActiveModel ID Range til 8 byte

  3. PostgreSQL - Tilføj nøgle til hvert objekt i et JSONB-array

  4. Reverse engineer SQLAlchemy deklarativ klassedefinition fra eksisterende MySQL-database?