sqlsql-serverrefactoringhardcoded

Refactor querying hardcoded values in function


Does anybody have any suggestions on how to refactor below better? I've renamed the item names to simplify.

I've only inherited this (for an import process) and it does not look very efficient to me especially with the hardcoded values in the function. I am looking at putting the hardcoded values into a table and refer to it instead of the function, but I'm not sure how to make that work yet based on the repetitive columns in the query.

MyTable
    MyTableId INT,
    MyTableOtherColumn VARCHAR(100),
    MyTableDesc1 VARCHAR(10),
    MyTableDesc2 VARCHAR(10),
    . . .
    MyTable24 VARCHAR(10),
    MyTable25 VARCHAR(10),
    etc.

MyFunction
    RETURNS @myFunctionTable TABLE
    (
        myFunctionDesc VARCHAR(256),
        myFunctionCode VARCHAR(10)
    )
    AS 
    BEGIN
        INSERT INTO @myFunctionTable (myFunctionDesc, myFunctionCode) VALUES ('My Function Desc 1', 'MYCODE1');
        INSERT INTO @myFunctionTable (myFunctionDesc, myFunctionCode) VALUES ('My Function Desc 2', 'MYCODE2');
        . . .
        INSERT INTO @myFunctionTable (myFunctionDesc, myFunctionCode) VALUES ('My Function Desc 99', 'MYCODE99');
        INSERT INTO @myFunctionTable (myFunctionDesc, myFunctionCode) VALUES ('My Function Desc 100', 'MYCODE100');
    END


SELECT 
    MyTableId,
    MyTableOtherColumn,
    . . . 
    (SELECT myFunctionCode FROM MyFunction() WHERE MyFunctionDesc = MyTableDesc1),
    (SELECT myFunctionCode FROM MyFunction() WHERE MyFunctionDesc = MyTableDesc2),
    . . .
    (SELECT myFunctionCode FROM MyFunction() WHERE MyFunctionDesc = MyTableDesc24),
    (SELECT myFunctionCode FROM MyFunction() WHERE MyFunctionDesc = MyTableDesc25),
FROM myTable T
JOIN . . .
WHERE . . .

Solution

  • Just use conditional aggregation and outer apply:

    SELECT MyTableId, MyTableOtherColumn,
           . . . 
           mf.val1, mv.val2, . . .
    FROM myTable T JOIN
         . . . OUTER APPLY
         (SELECT MAX(CASE WHEN MyFunctionDesc = MyTableDesc1 THEN myFunctionCode END) as val1,
                 MAX(CASE WHEN MyFunctionDesc = MyTableDesc2 THEN myFunctionCode END) as val2,
                 . . .
          FROM MyFunction()
         ) mf
    WHERE . . .