Home Forums SQL Server 2005 T-SQL (SS2K5) Stored Proc - Nullable Parameters for optional filtering - handling LinkTable LEFT JOINs RE: Stored Proc - Nullable Parameters for optional filtering - handling LinkTable LEFT JOINs

  • I think this may do what you are trying to do. If the search term is in both tables then the matching row only from Table A displays, otherwise ALL the rows in Table A are displayed.

    IF OBJECT_ID('tempdb..#TableA') IS NOT NULL

    DROP TABLE #TableA

    IF OBJECT_ID('tempdb..#LinkTable') IS NOT NULL

    DROP TABLE #LinkTable

    IF OBJECT_ID('tempdb..#TableB') IS NOT NULL

    DROP TABLE #TableB

    CREATE TABLE #TableA (

    [ID] INT NOT NULL,

    [Val] VARCHAR(10) NULL,

    PRIMARY KEY (ID),

    UNIQUE (ID))

    CREATE TABLE #LinkTable(

    [ID] INT IDENTITY(1,1) NOT NULL,

    [TableA_ID] INT NULL,

    [TableB_ID] INT NULL,

    PRIMARY KEY (ID),

    UNIQUE (ID))

    CREATE TABLE #TableB (

    [ID] INT NOT NULL,

    [Val] VARCHAR(10) NULL,

    PRIMARY KEY (ID),

    UNIQUE (ID))

    INSERT INTO #TableA

    SELECT 1,'Apples'

    UNION

    SELECT 2,'Pears'

    UNION

    SELECT 3,'Oranges'

    UNION

    SELECT 4,'Grapes'

    INSERT INTO #TableB

    SELECT 1,'Oranges'

    UNION

    SELECT 2,'Onions'

    UNION

    SELECT 3,'Apples'

    UNION

    SELECT 4,'Squash'

    INSERT INTO #LinkTable

    SELECT 1,3

    UNION

    SELECT 3,1

    DECLARE @strSearch VARCHAR(50)

    SET @strSearch = 'Apples'

    --SET @strSearch = 'Pears'

    --SET @strSearch = 'Oranges'

    --SET @strSearch = 'Onions'

    --SET @strSearch = ''

    SELECT

    a.ID

    ,a.Val

    FROM

    #TableA AS a

    LEFT OUTER JOIN

    #LinkTable AS lt

    ON a.ID = lt.TableA_ID

    LEFT OUTER JOIN

    #TableB AS b

    ON lt.TableB_ID = b.ID

    WHERE

    --if @strSearch in A and in B then matching row from A

    ((a.Val = ISNULL(NULLIF(@strSearch,''),0)

    AND (b.Val = ISNULL(NULLIF(@strSearch,''),0)))

    --if @strSearch not A or not B then ALL rows from A

    OR

    ((NOT EXISTS (SELECT ID FROM #TableA WHERE val = @strSearch)

    OR NOT EXISTS (SELECT ID FROM #TableB WHERE val = @strSearch))

    AND EXISTS (SELECT ID FROM #TableA)))