在 sql 函数中创建动态条件的最佳方式
Best way of creating dynamic conditions in sql functions
我对某些 "too much code produced" 或不是最优雅的编码方式问题有疑问:
ALTER FUNCTION [dbo].fn_Function
(@Location NVARCHAR(30) ='ALL')
RETURNS @ReportTable TABLE(DateOfProviValidity date,
DateOfFixumValidity date,
UserID NVARCHAR(50)
)
AS
BEGIN
DECLARE @CurrentMonth DATE
SET @CurrentMonth = dbo.fn_getFirstOfMonth(getdate())
IF @Location IS NOT NULL AND @Location <> 'ALL'
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1 AND Location = @Location
ELSE
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1 AND Location IS NOT NULL
RETURN
END
是否有可能去掉最初的 IF @Location
语句并将其添加到更接近 Where
子句的地方?
我的问题是 case 语句不起作用,因为我不能执行 Location equals or IS NOT NULL 语句。
这样的事情怎么样?
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE ISNULL(@Location, 'ALL') <> 'ALL'
OR Location = @Location
试试这个,
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1
AND Location = ISNULL(NULLIF(@Location,'ALL'),Location)
我对某些 "too much code produced" 或不是最优雅的编码方式问题有疑问:
ALTER FUNCTION [dbo].fn_Function
(@Location NVARCHAR(30) ='ALL')
RETURNS @ReportTable TABLE(DateOfProviValidity date,
DateOfFixumValidity date,
UserID NVARCHAR(50)
)
AS
BEGIN
DECLARE @CurrentMonth DATE
SET @CurrentMonth = dbo.fn_getFirstOfMonth(getdate())
IF @Location IS NOT NULL AND @Location <> 'ALL'
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1 AND Location = @Location
ELSE
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1 AND Location IS NOT NULL
RETURN
END
是否有可能去掉最初的 IF @Location
语句并将其添加到更接近 Where
子句的地方?
我的问题是 case 语句不起作用,因为我不能执行 Location equals or IS NOT NULL 语句。
这样的事情怎么样?
INSERT INTO @ReportTable
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE ISNULL(@Location, 'ALL') <> 'ALL'
OR Location = @Location
试试这个,
SELECT *
FROM dbo.fn_getFinalPData(@CurrentMonth)
WHERE 1
AND Location = ISNULL(NULLIF(@Location,'ALL'),Location)