我想撰寫一個存盤程序,它將根據以下條件回傳 true 或 false:
- 如果結果集中所有行中的 2 列都為 null,則回傳 true
- 如果至少有一個不為空,則回傳 false
例如在以下查詢中
select *
from Products
where productID = 123
and ProductType is null
and ProductDate is null
上面的查詢可以回傳1行,也可以回傳100行,所以如果都為null,則回傳true;如果至少 1 不為空,那么它將回傳 false。
uj5u.com熱心網友回復:
鑒于此示例資料和所需的結果:
CREATE TABLE dbo.Products
(
ProductID int,
ProductType int,
ProductDate date
);
INSERT dbo.Products(ProductID, ProductType, ProductDate)
VALUES
(123, NULL, NULL),(123, NULL, NULL), -- this should return 1
(456, 5, NULL), (456, NULL, NULL), -- this should return 0
(789, NULL, GETDATE()); -- this should return 0
我們可以做的:
CREATE PROCEDURE dbo.whatever1
@ProductID int
AS
BEGIN
DECLARE @return int = CASE WHEN EXISTS (SELECT 1
FROM dbo.Products
WHERE productID = @ProductID
AND (ProductType IS NOT NULL OR ProductDate IS NOT NULL)
) THEN 0 ELSE 1 END;
RETURN @return;
END
然后執行:
DECLARE @hr int;
EXEC @hr = dbo.whatever1 @ProductID = 123;
SELECT @hr;
EXEC @hr = dbo.whatever1 @ProductID = 456;
SELECT @hr;
EXEC @hr = dbo.whatever1 @ProductID = 789;
SELECT @hr;
結果:
1
0
0
棘手的一點是,當您說“回傳”時,我們不太確定您指的是顯式RETURN關鍵字、OUTPUT引數還是結果集。我覺得OUTPUT在這種情況下引數會更合適,因為RETURN通常保留用于錯誤/狀態(并且只能是int)。所以我們可以根據需要使用更合適的型別:
CREATE PROCEDURE dbo.whatever2
@ProductID int,
@return bit OUTPUT
AS
BEGIN
SET @return = CASE WHEN EXISTS (SELECT 1
FROM dbo.Products
WHERE productID = @ProductID
AND (ProductType IS NOT NULL OR ProductDate IS NOT NULL)
) THEN 0 ELSE 1 END;
END
然后執行:
DECLARE @return bit;
EXEC dbo.whatever2 @ProductID = 123, @return = @return OUTPUT;
SELECT @return;
EXEC dbo.whatever2 @ProductID = 456, @return = @return OUTPUT;
SELECT @return;
EXEC dbo.whatever2 @ProductID = 789, @return = @return OUTPUT;
SELECT @return;
結果:
1
0
0
- 此處的作業示例(但請注意,小提琴顯示
bit為true/false而不是1/0):db<>fiddle
如果這些程式中的任何一個不能像您期望的那樣作業,請調整您認為會產生錯誤結果的樣本資料,并具體說明“回傳”和“始終給我一個值”的含義- 我們不知道您在哪里看到1以及您為什么希望看到0。
uj5u.com熱心網友回復:
嘗試:
IF EXISTS (SELECT 1 FROM Products WHERE ProductID = 123 AND (ProductType IS NOT NULL OR ProductDate IS NOT NULL))
SELECT CAST (0 AS bit)
ELSE
SELECT CAST (1 AS bit)
使用exists比計數更有效,因為它只會掃描表直到滿足條件。Count 將始終掃描整個表。
uj5u.com熱心網友回復:
select IIF(COUNT(*) = 0, 'true','false')
from Products
where productID=@ProductID and ProductType is null and ProductDate is null
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360900.html
標籤:sql sql-server 查询语句
上一篇:我做了什么來增強這個陳述句selectinto因為它需要太多時間來處理2000行?
下一篇:SQL:試算平衡查詢的PIVOT
