SQL Server - Join only when the condition is number












0















I have a table EmployeeLeave



  CREATE TABLE EmployeeLeave (
EmployeeId INT,
LeaveType VARCHAR()
);


LeaveType can have numbers as well as string.



  CREATE TABLE MST_LeaveReason (
ReasonId INT,
Reason VARCHAR()
);

SELECT * FROM EmployeeLeave EL
LEFT JOIN MST_LeaveReason LR ON LR.ReasonId = EL.LeaveType


Above query will not work as LeaveType is not always number. I want this join to work only if the LeaveType is number. How can i implement it. Please help.



Thanks in advance.










share|improve this question























  • If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

    – Larnu
    Nov 22 '18 at 11:48













  • @Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

    – Jeroen Mostert
    Nov 22 '18 at 11:51


















0















I have a table EmployeeLeave



  CREATE TABLE EmployeeLeave (
EmployeeId INT,
LeaveType VARCHAR()
);


LeaveType can have numbers as well as string.



  CREATE TABLE MST_LeaveReason (
ReasonId INT,
Reason VARCHAR()
);

SELECT * FROM EmployeeLeave EL
LEFT JOIN MST_LeaveReason LR ON LR.ReasonId = EL.LeaveType


Above query will not work as LeaveType is not always number. I want this join to work only if the LeaveType is number. How can i implement it. Please help.



Thanks in advance.










share|improve this question























  • If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

    – Larnu
    Nov 22 '18 at 11:48













  • @Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

    – Jeroen Mostert
    Nov 22 '18 at 11:51
















0












0








0








I have a table EmployeeLeave



  CREATE TABLE EmployeeLeave (
EmployeeId INT,
LeaveType VARCHAR()
);


LeaveType can have numbers as well as string.



  CREATE TABLE MST_LeaveReason (
ReasonId INT,
Reason VARCHAR()
);

SELECT * FROM EmployeeLeave EL
LEFT JOIN MST_LeaveReason LR ON LR.ReasonId = EL.LeaveType


Above query will not work as LeaveType is not always number. I want this join to work only if the LeaveType is number. How can i implement it. Please help.



Thanks in advance.










share|improve this question














I have a table EmployeeLeave



  CREATE TABLE EmployeeLeave (
EmployeeId INT,
LeaveType VARCHAR()
);


LeaveType can have numbers as well as string.



  CREATE TABLE MST_LeaveReason (
ReasonId INT,
Reason VARCHAR()
);

SELECT * FROM EmployeeLeave EL
LEFT JOIN MST_LeaveReason LR ON LR.ReasonId = EL.LeaveType


Above query will not work as LeaveType is not always number. I want this join to work only if the LeaveType is number. How can i implement it. Please help.



Thanks in advance.







sql sql-server join






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 '18 at 11:46









ErmaErma

104313




104313













  • If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

    – Larnu
    Nov 22 '18 at 11:48













  • @Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

    – Jeroen Mostert
    Nov 22 '18 at 11:51





















  • If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

    – Larnu
    Nov 22 '18 at 11:48













  • @Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

    – Jeroen Mostert
    Nov 22 '18 at 11:51



















If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

– Larnu
Nov 22 '18 at 11:48







If your varchar is only going to have a length of 1, why not use char(1) and save the overhead of having a "variable" length?

– Larnu
Nov 22 '18 at 11:48















@Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

– Jeroen Mostert
Nov 22 '18 at 11:51







@Larnu: VARCHAR() is (fortunately?) not legal syntax. It's probably not shorthand for VARCHAR-with-no-length-which-is-implicitly-1 in this case.

– Jeroen Mostert
Nov 22 '18 at 11:51














1 Answer
1






active

oldest

votes


















3














Use try_convert():



SELECT *
FROM EmployeeLeave EL LEFT JOIN
MST_LeaveReason LR
ON LR.ReasonId = TRY_CONVERT(INT, EL.LeaveType);


You can also do this in the other direction:



SELECT *
FROM EmployeeLeave EL LEFT JOIN
MST_LeaveReason LR
ON CONVERT(VARCHAR(255), LR.ReasonId) = EL.LeaveType;


Then, work on fixing the data model. JOIN keys should be of the same type. Such conversions have a drastic affect on performance.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430313%2fsql-server-join-only-when-the-condition-is-number%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    Use try_convert():



    SELECT *
    FROM EmployeeLeave EL LEFT JOIN
    MST_LeaveReason LR
    ON LR.ReasonId = TRY_CONVERT(INT, EL.LeaveType);


    You can also do this in the other direction:



    SELECT *
    FROM EmployeeLeave EL LEFT JOIN
    MST_LeaveReason LR
    ON CONVERT(VARCHAR(255), LR.ReasonId) = EL.LeaveType;


    Then, work on fixing the data model. JOIN keys should be of the same type. Such conversions have a drastic affect on performance.






    share|improve this answer




























      3














      Use try_convert():



      SELECT *
      FROM EmployeeLeave EL LEFT JOIN
      MST_LeaveReason LR
      ON LR.ReasonId = TRY_CONVERT(INT, EL.LeaveType);


      You can also do this in the other direction:



      SELECT *
      FROM EmployeeLeave EL LEFT JOIN
      MST_LeaveReason LR
      ON CONVERT(VARCHAR(255), LR.ReasonId) = EL.LeaveType;


      Then, work on fixing the data model. JOIN keys should be of the same type. Such conversions have a drastic affect on performance.






      share|improve this answer


























        3












        3








        3







        Use try_convert():



        SELECT *
        FROM EmployeeLeave EL LEFT JOIN
        MST_LeaveReason LR
        ON LR.ReasonId = TRY_CONVERT(INT, EL.LeaveType);


        You can also do this in the other direction:



        SELECT *
        FROM EmployeeLeave EL LEFT JOIN
        MST_LeaveReason LR
        ON CONVERT(VARCHAR(255), LR.ReasonId) = EL.LeaveType;


        Then, work on fixing the data model. JOIN keys should be of the same type. Such conversions have a drastic affect on performance.






        share|improve this answer













        Use try_convert():



        SELECT *
        FROM EmployeeLeave EL LEFT JOIN
        MST_LeaveReason LR
        ON LR.ReasonId = TRY_CONVERT(INT, EL.LeaveType);


        You can also do this in the other direction:



        SELECT *
        FROM EmployeeLeave EL LEFT JOIN
        MST_LeaveReason LR
        ON CONVERT(VARCHAR(255), LR.ReasonId) = EL.LeaveType;


        Then, work on fixing the data model. JOIN keys should be of the same type. Such conversions have a drastic affect on performance.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 22 '18 at 11:48









        Gordon LinoffGordon Linoff

        781k35310414




        781k35310414
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430313%2fsql-server-join-only-when-the-condition-is-number%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

            Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

            A Topological Invariant for $pi_3(U(n))$