Ситуация в левом соединении - PullRequest
0 голосов
/ 07 января 2020

Итак, у меня есть две таблицы, у каждой из которых есть cocnumber или номер ChamberOfCommerce. Это всегда число 8-ди git, например, 12345678. Однако существует проблема: первая таблица aa имеет правильные 8-значные цифры CO C, а вторая таблица bb содержит комбинацию из 11 или 12-ди git CO C чисел. 11 И 12-ди git числа имеют четыре 0 в конце числа, которые не имеют значения.

Пример 11-ди git CO C: 12345670000

Пример 12-ди git CO C: 123456780000

Но почему есть ли числа 11-ди git CO C? Ну, нет. Что случилось, так это то, что числа 11-ди git CO C должны иметь 0 перед ними: 0123456780000, который обрезался при сохранении в базе данных.

случай 12-ди git CO C, я только что обрезал последние 4 цифры. Но для числа 11-ди git CO C я должен обрезать последние 4 цифры и добавить 0 перед номером CO C.

У меня вопрос, как бы я сделать оператор CASE, который выполняет эту манипуляцию, внутри LEFT JOIN?

Вот что у меня есть:

SELECT
  aa.cocnumber,
  bb.emloyeesnrtotal AS bb_emloyeesnrtotal

FROM aa
  LEFT JOIN bb ON aa.cocnumber = 
            CASE 
                WHEN LEN(bb.cocnumber) = 12
                    THEN LEFT(bb.cocnumber, 8)
                WHEN LEN(bb.cocnumber) = 11
                    THEN '0' + LEFT(bb.cocnumber, 7)
                END

Похоже, это не дает правильного результата. Может кто-нибудь помочь мне указать, что я делаю неправильно? Я думаю, что я беру здесь длину всего столбца bb.cocnumber, но как мне сделать утверждение, которое оценивает каждую ячейку bb.cocnumber в отдельности, чтобы увидеть, есть ли соответствующее 8-ди git aa.cocnumber?

Ответы [ 3 ]

1 голос
/ 07 января 2020

как мне сделать оператор, который оценивает каждую ячейку bb.cocnumber индивидуально, чтобы увидеть, есть ли соответствующий 8-ди git aa.cocnumber?

Вы можете сделать LEFT JOIN из bb до aa и проверьте наличие несопоставленных строк (а не наоборот):

SELECT
  bb.cocnumber
FROM bb LEFT JOIN aa 
ON aa.cocnumber = CASE 
  WHEN LEN(bb.cocnumber) = 12 THEN LEFT(bb.cocnumber, 8)
  WHEN LEN(bb.cocnumber) = 11 THEN '0' + LEFT(bb.cocnumber, 7)
END
WHERE LEN(bb.cocnumber) IN (11, 12) AND aa.cocnumber IS NULL

Это вернет все bb.cocnumber с, которые после преобразования вы делать, не совпадать ни с одним aa.cocnumber.

0 голосов
/ 07 января 2020

Я думаю, что было бы проще преобразовать номер в таблице aa в целое число:

SELECT
  aa.cocnumber,
  bb.emloyeesnrtotal AS bb_emloyeesnrtotal
FROM aa
  LEFT JOIN bb ON CAST(aa.cocnumber as int) = FLOOR(bb.cocnumber/10000)
0 голосов
/ 07 января 2020

Я предполагаю, что таблица bb хранит поле Cocnumber в виде целого числа, поэтому вы пропускаете ведущие нули.

Это проще, если вы просто сделаете все 12 цифр для начала и затем возьмите 8 левых символов, тогда вам не нужно беспокоиться о кейсах:

SELECT
aa.cocnumber,
bb.emloyeesnrtotal AS bb_emloyeesnrtotal
FROM aa
LEFT JOIN bb ON aa.cocnumber = LEFT(RIGHT('000000000000' + CAST(bb.cocnumber AS VARCHAR), 12), 8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...