[英]PL/SQL to select a number of items based on the value of a row in other table
[英]Extract a value based on a Row Number or CASE select
下面的代碼在我的右邊行,但是我只想返回一個值,而不必在上面加上更多(任何)CASE。 我可以重新檢查該行中兩個值中的哪個值最低,但是我要查找的實際值在“真實世界”中不是按字母順序排列的,因此可以為其分配值。
如果我找回最低的字段文本或CASE號(即20),那將是理想的選擇。 我只是不確定下一步要去哪里,而無需重新檢查兩個字段。
碼:
DECLARE @ID INT = '1234';
WITH GetMyInfo AS
(
SELECT field1, field2 , ID
, ROW_NUMBER() OVER (PARTITION BY ID,NAME ORDER BY CASE
WHEN ISNULL(field1, field2) = 'z' THEN 20
WHEN ISNULL(field1, field2) = 'b' THEN 10
WHEN ISNULL(field1, field2) = 't' or ISNULL(field1, field2) = 'f' THEN 0
ELSE 20
END) [RowNumber]
FROM TABLE
WHERE
(field1 IS NOT NULL OR field2 IS NOT NULL)
AND ID= @ID
)
SELECT field, field2
FROM GetMyInfo
WHERE RowNumber = 1
我想要類似Return RowNumberValue的東西
嗯。 。 。 我認為您可以:
WITH GetMyInfo AS (
SELECT t.*, field,
ROW_NUMBER() OVER (PARTITION BY ID, NAME
ORDER BY (CASE WHEN field = 'z' THEN 20
WHEN field = 'b' THEN 10
WHEN field in ('t', 'b') THEN 0
WHEN field is null THEN 100
ELSE 20
END)) [RowNumber]
FROM TABLE t CROSS APPLY
(VALUES (field1), (field2)) as v(field)
WHERE (field1 IS NOT NULL OR field2 IS NOT NULL) AND ID= @ID
)
SELECT field
FROM GetMyInfo
WHERE RowNumber = 1;
這將取消數據透視,因此您只能返回匹配的值。
如果可以的話,您可以使用一個額外的查詢來實現所需的內容
DECLARE @ID INT = '1234';
WITH GetMyInfo AS
(
SELECT field1,field2,caseNumber,ROW_NUMBER() OVER (PARTITION BY ID,NAME
ORDER BY [caseNumber] )[RowNumber]
FROM
(SELECT field1, field2 , ID,NAME
, CASE
WHEN ISNULL(field1, field2) = 'z' THEN 20
WHEN ISNULL(field1, field2) = 'b' THEN 10
WHEN ISNULL(field1, field2) = 't' or ISNULL(field1, field2) = 'f'
THEN 0
ELSE 20
END) [caseNumber]
FROM TABLE
)A
WHERE
(field1 IS NOT NULL OR field2 IS NOT NULL)
AND ID= @ID
)
SELECT field, field2,caseNumber
FROM GetMyInfo
WHERE RowNumber = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.