sql >> Base de Datos >  >> RDS >> Sqlserver

Convierta la expresión CASE en SQL en una columna derivada en SSIS

La moraleja de la siguiente historia es que solo porque puedes hacer algo en SSIS, no siempre es una buena idea.

Caso en cuestión, esta consulta. Sería mucho más eficiente usar la lógica sql existente para generar el valor final que usar columnas derivadas o una tarea de secuencia de comandos en SSIS (sin mencionar el desperdicio de memoria de canalización, CPU, etc.)

Consulta de origen

Utilicé lo siguiente como consulta de origen.

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

Encontrar posición porcentual

Determine si existe un símbolo de porcentaje en la columna. Esto crea una columna llamada PercentPosition

FINDSTRING(FixedARMRateReductionLimit, "%",1)

Buscar texto de tarifa

Debería ser suficiente hacer una comparación simple como muestra la primera expresión, pero estaba teniendo problemas con ella. Supongo que es una conversión/comparación de cadenas problema (ver la primera nota). En lugar de jugar con la obtención de un valor booleano, utilicé findstring para generar la posición ordinal.

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

Derivar salida

Disfrute del doble uso del operador ternario .

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

Podrías haber simplificado algo de esto en una tarea de secuencia de comandos, pero solo haría la lógica en el código fuente.