繁体   English   中英

根据行号或CASE选择提取值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM