大佬教程收集整理的这篇文章主要介绍了使用 udt,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究过滤器功能,但我在使用 sql 时遇到了困难。
我有这个逻辑的过程。
RIGHT JOIN @filterquery as fq
ON (fq.Bpm = c.BPM OR fq.Bpm IS NulL)
AND (fq.Price >= c.Price OR fq.Price IS NulL)
AND (fq.GenreTypeID = g.ID OR fq.GenreTypeID IS NulL)
AND (fq.KeyTypeID = k.ID OR fq.KeyTypeID IS NulL)
AND (fq.TrackTypeID = t.ID OR fq.TrackTypeID IS NulL)
我的测试代码如下
DECLARE @filters AS dbo.Filtertable,@PageIndex int = 0,@PageSize int = 10
INSERT INTO @filters (Bpm,Price,GenreTypeID,KeyTypeID,TrackTypeID)
VALUES (126,null,null),(76,2)
EXECUTE dbo.PROC @filters,@PageIndex,@PageSize
现在我的问题是,当我运行我的代码时,我的结果集看起来像这样。
Bpm Price GenreTypeID KeyTypeID TrackTypeID
126 5.99 1 1 1
126 4.99 1 1 1
这是有道理的,因为没有 BPM 76 和 TrackTypeID 2 的记录,但是因为第一组BPM 126 的值在 TrackTypeID 处为 NulL 它不会从第二组值中过滤 TrackTypeID 2 .
我需要我的结果集为空,因为数据库中没有任何的记录TrackTypeID 2.这可能吗?
编辑:我希望我的结果集为空,因为没有 trackTypeID 为 2 的数据。但目前它给我所有 126 BPM,因为对于这个特定过滤器,trackTypeID 为空。
根据您尝试实现的逻辑判断,您需要的是每个过滤器列的单独表类型。您还应该具有以下样式的逻辑
WHERE (NOT EXISTS (SELECT 1 FROM @columnFilters) OR column IN (SELECT * FROM @columnFilters))
出于这种目的,我通常会在我的数据库中保留一些标准的各种数据类型的单列表类型。
WHERE (NOT EXISTS (SELECT 1 FROM @Bpm) OR
c.Bpm IN (SELECT * FROM @Bpm))
AND (c.Price >= @Price OR @Price IS NULL)
AND (NOT EXISTS (SELECT 1 FROM @GenreTypeId) OR
g.Id IN (SELECT * FROM @GenreTypeId))
AND (NOT EXISTS (SELECT 1 FROM @KeyTypeId) OR
k.Id IN (SELECT * FROM @KeyTypeId))
AND (NOT EXISTS (SELECT 1 FROM @TrackTypeId) OR
t.Id IN (SELECT * FROM @TrackTypeId))
注意对 @Price
使用标量变量,因为您可以输入所需的最小值,因为条件是不等式 >=
。
如果您确实也想为此使用表格,您可以这样做:
(NOT EXISTS (SELECT 1 FROM @Price) OR
c.Price >= ANY(SELECT * FROM @GenreTypeId))
如果您尝试访问索引,我强烈建议您查看 OPTION(RECOMPILE)
或动态 SQL 以获取此类查询。
以上是大佬教程为你收集整理的使用 udt全部内容,希望文章能够帮你解决使用 udt所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。