我在下面有一张桌子。
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来使此工作正常,但我不太确定。
答案 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;