IF语句时对函数的查询(MSSQL)
我有 我希望创建具有输入参数(如Table.Citizen_id)的函数Table_Citizens,并仅为该id输出结果。 但若Table.Citizen_id=0,那个么函数应该输出所有id的数据。我想知道如何执行这个IF语句时对函数的查询(MSSQL),sql,sql-server,if-statement,func,Sql,Sql Server,If Statement,Func,我有 我希望创建具有输入参数(如Table.Citizen_id)的函数Table_Citizens,并仅为该id输出结果。 但若Table.Citizen_id=0,那个么函数应该输出所有id的数据。我想知道如何执行这个 SELECT Table.Citizen_id AS ID, Citizens.Name as Name, Citizens.City as City FROM Table INNER JOIN Citizens ON Table.Cit
SELECT
Table.Citizen_id AS ID,
Citizens.Name as Name,
Citizens.City as City
FROM Table
INNER JOIN Citizens
ON Table.Citizen_id = Citizens.id
GROUP BY Table.Citizen_id, Citizens.Name,Citizens.City;
这不起作用函数中的查询如下所示:
CREATE FUNCTION dbo.Calls_ABCs(@ABC_id AS INT)
RETURNS TABLE
AS
RETURN
SELECT
Calls.ABC_id AS ID,
ABCs.Name as Name,
ABCs.City as City,
COUNT(Calls.Call_start) as Count_Calls,
AVG(Calls.Duration) AS AVG_Call_duration,
MAX(Calls.Duration) AS MAX_Call_duration,
SUM(Calls.Duration) AS SUM_Call_duration,
SUM(Calls.Cost) AS SUM_Call_cost,
AVG(Calls.Cost) AS AVG_Calls_Cost,
FROM Calls
INNER JOIN ABCs
ON Calls.ABC_id = ABCs.id WHERE (@ABC_id=0 or Calls.ABC_id = @ABC_id) and Calls.Call_Start > '2013-03-17' GROUP BY Calls.ABC_id, ABCs.Name,ABCs.City;
GO
通常,这是用NULL
值而不是0
表示的,因为NULL
适用于所有数据类型。在这种情况下:
SELECT
Table.Citizen_id AS ID,
Citizens.Name as Name,
Citizens.City as City
FROM Table INNER JOIN
Citizens
ON Table.Citizen_id = Citizens.id
where @Id = 0 or table.Citizen_id = @id
GROUP BY Table.Citizen_id, Citizens.Name,Citizens.City;
函数中的查询如下所示:
CREATE FUNCTION dbo.Calls_ABCs(@ABC_id AS INT)
RETURNS TABLE
AS
RETURN
SELECT
Calls.ABC_id AS ID,
ABCs.Name as Name,
ABCs.City as City,
COUNT(Calls.Call_start) as Count_Calls,
AVG(Calls.Duration) AS AVG_Call_duration,
MAX(Calls.Duration) AS MAX_Call_duration,
SUM(Calls.Duration) AS SUM_Call_duration,
SUM(Calls.Cost) AS SUM_Call_cost,
AVG(Calls.Cost) AS AVG_Calls_Cost,
FROM Calls
INNER JOIN ABCs
ON Calls.ABC_id = ABCs.id WHERE (@ABC_id=0 or Calls.ABC_id = @ABC_id) and Calls.Call_Start > '2013-03-17' GROUP BY Calls.ABC_id, ABCs.Name,ABCs.City;
GO
通常,这是用NULL
值而不是0
表示的,因为NULL
适用于所有数据类型。在这种情况下:
SELECT
Table.Citizen_id AS ID,
Citizens.Name as Name,
Citizens.City as City
FROM Table INNER JOIN
Citizens
ON Table.Citizen_id = Citizens.id
where @Id = 0 or table.Citizen_id = @id
GROUP BY Table.Citizen_id, Citizens.Name,Citizens.City;
试试这个-
查询:
where @Id is NULL or table.Citizen_id = @Id
CREATE FUNCTION dbo.[udf_getCitizens]
(
@Citizen_id INT
)
RETURNS @Result TABLE (ID INT, Name VARCHAR(50), City VARCHAR(50))
AS
BEGIN
INSERT INTO @Result(ID, Name, City)
SELECT DISTINCT
ID = t.Citizen_id
, c.Name
, c.City
FROM dbo.[Table] t
JOIN dbo.Citizens c ON t.Citizen_id = Citizens.id
WHERE @Citizen_Id = 0 OR t.Citizen_id = @Citizen_id
RETURN
END
执行官:
where @Id is NULL or table.Citizen_id = @Id
CREATE FUNCTION dbo.[udf_getCitizens]
(
@Citizen_id INT
)
RETURNS @Result TABLE (ID INT, Name VARCHAR(50), City VARCHAR(50))
AS
BEGIN
INSERT INTO @Result(ID, Name, City)
SELECT DISTINCT
ID = t.Citizen_id
, c.Name
, c.City
FROM dbo.[Table] t
JOIN dbo.Citizens c ON t.Citizen_id = Citizens.id
WHERE @Citizen_Id = 0 OR t.Citizen_id = @Citizen_id
RETURN
END
试试这个-
查询:
where @Id is NULL or table.Citizen_id = @Id
CREATE FUNCTION dbo.[udf_getCitizens]
(
@Citizen_id INT
)
RETURNS @Result TABLE (ID INT, Name VARCHAR(50), City VARCHAR(50))
AS
BEGIN
INSERT INTO @Result(ID, Name, City)
SELECT DISTINCT
ID = t.Citizen_id
, c.Name
, c.City
FROM dbo.[Table] t
JOIN dbo.Citizens c ON t.Citizen_id = Citizens.id
WHERE @Citizen_Id = 0 OR t.Citizen_id = @Citizen_id
RETURN
END
执行官:
where @Id is NULL or table.Citizen_id = @Id
CREATE FUNCTION dbo.[udf_getCitizens]
(
@Citizen_id INT
)
RETURNS @Result TABLE (ID INT, Name VARCHAR(50), City VARCHAR(50))
AS
BEGIN
INSERT INTO @Result(ID, Name, City)
SELECT DISTINCT
ID = t.Citizen_id
, c.Name
, c.City
FROM dbo.[Table] t
JOIN dbo.Citizens c ON t.Citizen_id = Citizens.id
WHERE @Citizen_Id = 0 OR t.Citizen_id = @Citizen_id
RETURN
END
谢谢对不起,我重写了我的帖子。也许是不清楚。当id=0时,我需要为所有id和其他地方的当前id输出f。@user2377214。这就是此查询的作用。再次感谢,但这在SQL SERVER 2012上不起作用。0返回空值。声明@ID INT SELECT@ID=5 SELECT*FROM dbo.udf_getCitizens(@ID)@user2377214。这大概是因为id为5的记录在“2013-03-17”之后没有记录。当您硬编码“5”并在函数外部运行它时,查询是否返回任何内容?“其中@Id为NULL或table.Citizen_Id=@Id”。我忘了这个把戏叫什么了?那它为什么有效呢?谢谢。对不起,我重写了我的帖子。也许是不清楚。当id=0时,我需要为所有id和其他地方的当前id输出f。@user2377214。这就是此查询的作用。再次感谢,但这在SQL SERVER 2012上不起作用。0返回空值。声明@ID INT SELECT@ID=5 SELECT*FROM dbo.udf_getCitizens(@ID)@user2377214。这大概是因为id为5的记录在“2013-03-17”之后没有记录。当您硬编码“5”并在函数外部运行它时,查询是否返回任何内容?“其中@Id为NULL或table.Citizen_Id=@Id”。我忘了这个把戏叫什么了?为什么它能工作?谢谢,但是如果@Citizen\u id=0 dbo。[udf\u getCitizens]应该只为所选id返回id=t.Citizen\u id,用于所有其他id。谢谢,但是如果@Citizen\u id=0 dbo。[udf\u getCitizens]应该只为所选id返回id=t.Citizen\u id。