简体   繁体   English

根据行号或CASE选择提取值

[英]Extract a value based on a Row Number or CASE select

Code below gets my the right row, however I'd like to return one value only, without having to put much more (any) CASE on it. 下面的代码在我的右边行,但是我只想返回一个值,而不必在上面加上更多(任何)CASE。 I could recheck which of the two values from the row is lowest but the actual values I'm looking for are not alphabetical in the 'real world' thus assigning them values. 我可以重新检查该行中两个值中的哪个值最低,但是我要查找的实际值在“真实世界”中不是按字母顺序排列的,因此可以为其分配值。

If I get back either the lowest field text or the CASE number ie 20 that would be ideal. 如果我找回最低的字段文本或CASE号(即20),那将是理想的选择。 I'm just not sure where to go next, without rechecking the two fields. 我只是不确定下一步要去哪里,而无需重新检查两个字段。

Code: 码:

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

I'd like something like Return RowNumberValue 我想要类似Return RowNumberValue的东西

Hmmm . 嗯。 . . I think you can do: 我认为您可以:

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;

This unpivots the data, so you can only return the matching value. 这将取消数据透视,因此您只能返回匹配的值。

You can use one extra query to achieve what you want if it's ok for you 如果可以的话,您可以使用一个额外的查询来实现所需的内容

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