如果列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
.