SQL-запрос для получения правильных полей - PullRequest
0 голосов
/ 03 октября 2018

У меня есть таблица ниже.

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

У нас есть три поля, и поле CardType имеет значение NULL.Что я хочу сделать, это найти правильное соответствие.Например, если я перейду к запросу:

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

Но вместо Visa я передам что-нибудь еще для JPMorgan под CardType, он должен сопоставить общую запись с типом карты NULL.Как показано ниже.

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

Как мне добиться этого?

DECLARE
@Company nvarchar(50)
@CardType nvarchar(50) = NULL
@ErrorCode nvarchar(50)

SET
@Company = 'JPMorgan'
@CardType = NULL
@ErrorCode = '01'

SELECT * FROM Bank
WHERE Company = @Company
AND (@CardType IS NULL OR CardType = @CardType)
AND ErrorCode = @ErrorCode

Это то, что я получил, однако, это не правильно, потому что когда я передаю (JPMorgan, NULL,01) возвращает неверный результат.Может кто-нибудь, пожалуйста, помогите мне с этим.Мне сказали, что я должен использовать PARTITION и GROUP BY OR ROW_NUMBER, чтобы это работало, но я не слишком уверен.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Похоже, вы хотите лучший матч.Для этого 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;
0 голосов
/ 03 октября 2018

Как я понял из примера.Кажется, что NULL CardType нужно выбирать, когда нет точного совпадения для найденного @CardType.

Так что затем включите в смесь CardType IS NULL вместо @CardType IS NULL.

Иполучите верхний 1, упорядоченный по убыванию CardType.

Но синтаксис для верхнего n зависит от того, какую СУБД вы используете.См ссылка .

SELECT * 
FROM Bank
WHERE Company = @Company
AND (CardType = @CardType OR CardType IS NULL)
AND ErrorCode = @ErrorCode
ORDER BY CardType DESC
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...