![](/img/trans.png)
[英]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.