英文:
If else exist statement in select query
问题
以下是翻译好的部分:
这里有三个表格,我想要一个查询来选择在接下来的7天内将会过期的筛选器/过滤器。
我在Filter
表中有2列,分别是filterExp
,以及在FilterChange
表中的filterExpCustom
。如果filterExpCustom
为空,则第一个是默认值。
所有的过滤器都有一个以天为单位的过期值,但在某些情况下,一些用户希望为其自己更改过期值。因此,他们可以为特定的客户和过滤器设置filterExpCustom
。
以下是一些实际值,以便更好理解:
Filter
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (1, N'pp', 6)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (2, N'Carbonate', 5)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (3, N'Carbon Block', 5)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (4, N'Carbon Post', 12)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (5, N'Mineral', 12)
FilterChange
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (186, 3, 2, 65, CAST(N'2023-01-31' AS Date), 7)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (187, 3, 5, 65, CAST(N'2023-01-31' AS Date), NULL)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (188, 2, 3, 66, CAST(N'2023-02-01' AS Date), 10)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (189, 2, 3, 66, CAST(N'2023-02-01' AS Date), NULL)
这是我可以从现在到接下来的7天获取过期的过滤器的查询:
CREATE PROCEDURE [dbo].[FilterExpirationGetList]
@userName BIGINT
AS
DECLARE @InNextDays int
BEGIN
SET @InNextDays = 7
SELECT f.filterId,f.filterName, f.filterExp,
fc.customerId, fc.customerDeviceId, fc.filterChangeDate, fc.filterExpCustom,
c.fName, c.lName, c.cMobile, c.userName
FROM FilterChange fc INNER JOIN
Filter f ON fc.filterId = f.filterId INNER JOIN
Customer c ON c.CustomerId = fc.customerId
WHERE c.userName = @userName AND
DATEADD(DAY, DATEPART(DAY, GETDATE())
- DATEPART(DAY, DATEADD(DAY,f.filterExp,fc.filterChangeDate)),
DATEADD(DAY,f.filterExp,fc.filterChangeDate))
BETWEEN CONVERT(DATE, GETDATE())
AND CONVERT(DATE, GETDATE() + @InNextDays);
END
我的查询的问题是我不知道如何选择过期的过滤器,如果filterExpCustom
有一些值,但如果它为空,查询必须计算filterExp
。
英文:
Here are three tables where I want a query to select which filter/s will be expired in 7 next few days.<br/>
<br>
I have 2 columns called filterExp
in the Filter
table and filterExpCustom
in the FilterChange
table, the first is the default if the second is not empty.
All filters have an expiration value in the day terms but in some cases, some users want to change the expiration value for their own. So they can set filterExpCustom
for specific customers and filters.
<br>
Here are some actual values to better understand:<br>
Filter
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (1, N'pp', 6)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (2, N'Carbonate', 5)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (3, N'Carbon Block', 5)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (4, N'Carbon Post', 12)
INSERT [Filter] ([filterId], [filterName], [filterExp])
VALUES (5, N'Mineral', 12)
FilterChange
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (186, 3, 2, 65, CAST(N'2023-01-31' AS Date), 7)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (187, 3, 5, 65, CAST(N'2023-01-31' AS Date), NULL)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (188, 2, 3, 66, CAST(N'2023-02-01' AS Date), 10)
INSERT [FilterChange] ([filterChnageId], [customerId], [filterId], [customerDeviceId], [filterChangeDate], [filterExpCustom])
VALUES (189, 2, 3, 66, CAST(N'2023-02-01' AS Date), NULL)
Here is the query that I can get the expired filter/s from now until 7 days next:
CREATE PROCEDURE [dbo].[FilterExpirationGetList]
@userName BIGINT
AS
DECLARE @InNextDays int
BEGIN
SET @InNextDays = 7
SELECT f.filterId,f.filterName, f.filterExp,
fc.customerId, fc.customerDeviceId, fc.filterChangeDate, fc.filterExpCustom,
c.fName, c.lName, c.cMobile, c.userName
FROM FilterChange fc INNER JOIN
Filter f ON fc.filterId = f.filterId INNER JOIN
Customer c ON c.CustomerId = fc.customerId
WHERE c.userName = @userName AND
DATEADD(DAY, DATEPART(DAY, GETDATE())
- DATEPART(DAY, DATEADD(DAY,f.filterExp,fc.filterChangeDate)),
DATEADD(DAY,f.filterExp,fc.filterChangeDate))
BETWEEN CONVERT(DATE, GETDATE())
AND CONVERT(DATE, GETDATE() + @InNextDays);
END
The problem with my query is I don't know how to select expired filters if filterExpCustom
has some value but if it doesn't, the filterExp
must be calculated in the query.
答案1
得分: 2
以下是翻译好的部分:
"Something like this perhaps, you use ISNULL to get the correct day extension:" 可能是这样,您使用ISNULL来获取正确的天数延长:
"I'm not sure what you do with customers where filters expired before today though. Your design seem lacking a sort of flag that says that filterchange is 'superceeded' with another change." 我不确定对于那些在今天之前过期的过滤器,您要做什么。您的设计似乎缺少一种指示过滤器更改已被另一更改“替代”的标志。
"Alternatively you can fetch only the latest filterchange per filter type where expiration dates are less than 7 days forward. I leave it as an exercise to the reader." 或者,您可以仅检索每种过滤器类型的最新过滤器更改,其中过期日期在7天内。我将其留给读者作为练习。
英文:
Something like this perhaps, you use ISNULL to get the correct day extension:
select *
from customer c
inner join FilterChange fc
ON fc.customerID = fc.CustomerID
INNER JOIN Filter f
ON f.filterID = fc.filterID
WHERE DATEADD(DAY, ISNULL(fc.filterExpCustom,filterExp), filterChangeDate) BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 7, GETDATE())
I'm not sure what you do with customers where filters expired before today though. Your design seem lacking a sort of flag that says that filterchange is "superceeded" with another change.
Alternatively you can fetch only the latest filterchange per filter type where expiration dates is less than 7 days forward. I leave it as exercise to the reader
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论