SQL查询以获取正确的字段

时间:2018-10-03 18:40:10

标签: sql stored-procedures

我在下面有一张桌子。

    best_run, best_model = optim.minimize(model=model,
     data=data,
     functions=[f1],
     algo=tpe.suggest,
     max_evals=5,
     trials=Trials())

我们有三个字段,而CardType字段可以为空。 我要做的是找到正确的匹配项。 例如,如果我传入查询:

#  Company      CardType      ErrorCode
------------------------------------------
1  JPMorgan     Visa          01
2  JPMorgan     NULL          01
3  BoA          Visa          01
4  BoA          Visa          02
5  Citigroup    MasterCard    01

但是我可以使用CardType将JPMorgan的其他任何内容传递给Visa,而不是Visa,它应该与卡类型为NULL的通用记录匹配。如下所示。

(JPMorgan, Visa, 01) it should match record 1.

如何实现这一目标?

(JPMorgan, MasterCard, 01) it should match record 2.
(JPMorgan, Chase, 01) it should match record 2.
(JPMorgan, NULL, 01) it should match record 2.

这是我得到的,但这是不正确的,因为当我传入(JPMorgan,NULL,01)时,它将返回错误的结果。 有人可以帮我吗有人告诉我我必须使用PARTITION和GROUP BY OR ROW_NUMBER来使此工作正常,但我不太确定。

2 个答案:

答案 0 :(得分:0)

从示例中我了解到。似乎与找到的@CardType不完全匹配时,需要选择NULL CardType。

因此,将CardType IS NULL而不是@CardType IS NULL包括在内。

并按CardType降序获得前1名。

但是前n个的语法取决于您使用的DBMS。参见reference

SELECT * 
FROM Bank
WHERE Company = @Company
AND (CardType = @CardType OR CardType IS NULL)
AND ErrorCode = @ErrorCode
ORDER BY CardType DESC
LIMIT 1

答案 1 :(得分:0)

您似乎想要最佳匹配。为此,row_number()确实是一个可行的解决方案:

SELECT b.*
FROM (SELECT b.*,
             ROW_NUMBER() OVER (ORDER BY ((CASE WHEN Company = @Company THEN 1 ELSE 0 END) +
                                          (CASE WHEN CardType = @CardType OR CardType IS NULL and @CardType IS NULL THEN 1 ELSE 0 END) +
                                          (CASE WHEN ErrorCode = @ErrorCode THEN 1 ELSE 0 END)
                                         ) DESC
                               ) as seqnum
      FROM Bank b
      WHERE (Company = @Company OR @Company IS NULL) AND
            (CardType = @CardType OR
             @CardType IS NULL OR
             CardType IS NULL
            ) AND
            (ErrorCode = @ErrorCode OR @ErrorCode IS NULL)
     ) b
WHERE seqnum = 1;