当条件为假时,使用LEFT OUTER JOIN重新传输数据,否则为INNER JOIN

时间:2017-03-06 13:08:31

标签: c# sql sql-server

在一个过程中,我需要根据条件检索数据。

如果该条件为假,我需要使用LEFT OUTER JOIN,但如果该条件为真,我需要使用INNER JOIN。

这就是我的尝试。

ALTER PROCEDURE [dbo].[GetFooBarData]    
@UDT VarcharUDT readonly
AS BEGIN    

DECLARE @IsUDTNull BIT
SELECT @IsUDTNull = ISNULL((SELECT TOP 1 1 FROM @UDT),0)

SELECT [Foo], 
       [Bar]
  FROM [dbo].[FooBar] FB
  LEFT OUTER JOIN @UDT T ON @IsUDTNull = 0 OR FB.Foo LIKE '%' + T.Item + '%'
END

我这样称为proc

DECLARE @sa VarcharUDT

INSERT INTO @sa (Item)
SELECT 'XS0995537155'

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetFooBarData]
        @UDT = @sa

SELECT  'Return Value' = @return_value

GO

这不按预期工作,即使UDT包含值,也会返回所有数据。

UDT

CREATE TYPE [dbo].[VarcharUDT] AS TABLE(
    [Item] [varchar](100) NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [Item] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO

1 个答案:

答案 0 :(得分:4)

如果要在一个语句中执行此操作,请使用LEFT JOIN并检查WHERE子句中的条件:

SELECT [Foo], [Bar]
FROM [dbo].[FooBar] FB LEFT OUTER JOIN
      @UDT T 
      ON FB.Foo LIKE '%' + T.Item + '%'
WHERE (@UseLeftJoin = 1) OR (T.Item IS NOT NULL);