我需要创建一个表函数,在第1列中生成一个指定数字的参数,始终从1开始。在第2列中,如果第1列可以被5整除,它将说“< Div5'否则NULL
。
以此为例。我指定第1列将在5处停止,最终结果将如下所示;
1 NULL
2 NULL
3 NULL
4 NULL
5 Div5
我可以创建该功能,但我不确定如何创建条件第一列,或者如何说第2列除以5是一个整数然后是' Div5'如果它是小数,则为NULL;
create function MyFunction ()
Returns @Division Table
(Ind int ,
Div5 varchar(30))
AS
begin
Insert Into @Division (Ind, Div5)
select ???,???
Return;
End;
我希望这能提供足够的细节吗?
谢谢:)
答案 0 :(得分:1)
这应该可以解决问题:
DECLARE @divisor INT = 10, @limit INT = 100;
WITH
L0 AS(SELECT 1 AS C UNION ALL SELECT 1 AS O),
L1 AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS(SELECT 1 AS C FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS(SELECT 1 AS C FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS(SELECT 1 AS C FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS(SELECT 1 AS C FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L5)
SELECT N, CASE WHEN N % @divisor = 0 THEN 'Div' + CAST(@divisor AS VARCHAR(100)) ELSE NULL END AS Col2 FROM Nums
WHERE N <= @limit
2个变量决定了你要寻找第一列可被整除的数字,第二个是你想要去多远的数字,下一个数字只是一个CTE来生成第一列的数字(数字表)对于像这样的东西非常有用)。然后它只是从数字表中选择所有数字到你的极限和一个case表达式来检查它是否可以被你指定的数字整除(余数为0)和DivX位的一些字符串连接。
您应该可以轻松地将此逻辑集成到您的功能中。
答案 1 :(得分:0)
您正在寻找基本上返回除法问题剩余部分的Modulo运算符。
DECLARE @SOMETBL TABLE (ROWNUM INT, DIVSTATUS CHAR(4))
INSERT @SOMETBL
(ROWNUM)
SELECT 1
UNION
SELECT 5
UNION
SELECT 2
UNION
SELECT 10
UPDATE @SOMETBL
SET DIVSTATUS = CASE WHEN ROWNUM%5 > 0 THEN NULL ELSE 'DIV5' END
SELECT * FROM @SOMETBL