5

我想应用条件 where 子句也就是说,如果我的barcode参数为空,那么我想获取所有记录,如果它带有值,那么我只想获取第二部分的匹配记录,我能够获取匹配的记录但是我被困在获取所有记录的情况下,如果我尝试过如下的空值,

 SELECT item 
 FROM tempTable
 WHERE 
  ((ISNULL(@barcode,0)=1)
      // but this is not fetching all the records if barcode is null 
   OR
   ISNULL(@barcode,0!= 1 AND tempTable.barcode LIKE @barcode+'%'))
      //THis is working perfect 

所以任何帮助都会很棒

4

8 回答 8

14

我可能误解了您的要求,但逻辑OR运算符可能会有所帮助:

SELECT item 
 FROM tempTable
 WHERE 
 @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%'

如果@barcodeNULL,则返回所有记录,如果不是NULL,则返回所有满足条件的记录LIKE @barcode+'%'

重要的

另外,请记住,当与几个复杂的条件 AND-ed 一起使用时,使用OR运算符似乎会导致有趣的结果,并且没有正确地括在大括号中:

<A> AND <B> AND <C> OR <D> AND <E> AND <F>

最有可能实际上被表述为:

(<A> AND <B> AND <C>) OR (<D> AND <E> AND <F>)

请记住,解析器不知道您想要实现什么,您必须正确描述您的意图......

于 2013-09-11T09:34:53.983 回答
2

我认为您可以将其简化为:

  SELECT item 
 FROM tempTable
 WHERE @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%'

因此,当@barcode 为空时,您将获得所有内容- 即不需要执行的地方的Like 部分。如果@barcode 有一个值,那么 Like 将被执行。

于 2013-09-11T09:34:32.363 回答
2

如果条形码字段不为空,那么这是我将使用的方法 -

SELECT item 
FROM tempTable
WHERE barcode like isnull(@barcode, barcode) + '%'

如果@barcode 为空,则返回所有记录,如果它不为空,则只返回匹配的记录。

如果条形码字段可以为空,则 -

SELECT item 
FROM tempTable
WHERE isnull(barcode, '') like isnull(@barcode, isnull(barcode, '')) + '%'

与第一个相同,但在这里我们在进行比较之前将条形码字段中的空值转换为空白字符串。

于 2014-02-06T22:41:21.443 回答
1

另一个答案和赏金的尝试

declare @barcode nvarchar(10) -- chose nvarchar not necessarily should be nvarchar
select @barcode= NULL
--select @barcode='XYZ'
if @barcode is null
select item from temptable;
else
select item from temptable where temptable.barcode like @barcode+'%';
于 2014-02-03T15:46:51.890 回答
1

如果我必须这样做,我会这样做

SELECT item 
 FROM tempTable
 WHERE 
( ( ISNULL(@barcode,'') <> '')  AND ( tempTable.barcode LIKE @barcode+'%' ) )

( ISNULL(@barcode,'') <> '')还会检查变量是否为空白,那么它不应该返回任何东西。但是,如果您只是检查 null,那么如果@barcode为空白,您item将从tempTable.

于 2014-02-04T13:57:21.243 回答
0

如果列barcode不可为空,则可以大大简化查询。这是基于模式'%'匹配任何字符串的事实;甚至是一个空(即零长度)字符串。因此,以下 WHERE 子句匹配所有记录:

WHERE barcode LIKE '%'

您可能会注意到,这与您用于过滤特定条形码上的记录的 WHERE 子句非常相似:

WHERE barcode LIKE @barcode + '%'

事实上,它们非常相似,我们不妨对这两种情况都使用一个 WHERE 子句;毕竟,'' + '%'等于'%'

IF @barcode IS NULL SET @barcode = ''
SELECT item FROM tempTable WHERE barcode LIKE @barcode + '%'

还有一个更短的版本,它保留了 的原始值@barcode

SELECT item FROM tempTable WHERE barcode LIKE ISNULL(@barcode, '') + '%'

如前所述,这仅在列barcode不可为空时才有效。如果 columnbarcode可以为空(并且您对 where 的记录真正感兴趣barcode IS NULL),那么以下查询可能对您有用:

SELECT item FROM tempTable
WHERE ISNULL(barcode, '') LIKE ISNULL(@barcode, '') + '%'

但是,这个版本有两个缺点:

  • 它的执行速度可能会慢得多,因为查询优化器可能不会从 column 上的索引中受益barcode
  • 如果@barcode = '',那么它不仅会匹配非空条码,还会匹配带有barcode IS NULL;的记录。这是否可以接受,取决于你。

最后一个简化:您可能希望与外界达成共识,即他们应该设置@barcode = ''而不是NULL检索所有记录。然后你可以替换ISNULL(@barcode, '')@barcode.

于 2014-02-03T19:56:03.607 回答
0

如果@barcode 为空

开始

从临时表中选择项目

结尾

else SELECT item FROM tempTable where tempTable.barcode LIKE @barcode+'%'

于 2014-02-05T07:49:01.820 回答
0

除了 ppeterka 的解决方案(这将导致索引/表扫描)之外,至少还有其他三种解决方案。这些解决方案可以使用Index Seekif @barcodeis not NULL 并且如果barcode列上有索引:

解决方案#2:执行计划没有被缓存和重用:

SELECT item 
FROM tempTable
WHERE @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%'
OPTION(RECOMPILE);

解决方案#3:执行计划被缓存(如果可选参数的数量很少,可以使用它):

IF @barcode IS NULL
    SELECT item 
    FROM tempTable;
ELSE
    SELECT item 
    FROM tempTable
    WHERE tempTable.barcode LIKE @barcode+'%';

解决方案#4:执行计划被缓存(如果可选参数的数量很高,可以使用它):

DECLARE @SqlStatement NVARCHAR(MAX);
SET @SqlStatement = N'
SELECT item 
FROM tempTable
WHERE 1=1 '
+ CASE WHEN @barcode IS NULL THEN N'' ELSE N'AND tempTable.barcode LIKE @pBarcode+''%''; ' END; 
-- + CASE WHEN @anotherparam IS NULL THEN N'' ELSE 'AND ...' END ;

EXEC sp_executesql @SqlStatement, N'@pBarcode VARCHAR(10)', @pBarcode = @barcode;

注意:使用正确的类型和最大值。参数的长度/精度和比例@pBarcode

于 2014-02-09T10:15:42.050 回答