/ / Join na podstawie części pola varchar pasującego do innego pola - sql-server-2008, join, conditional

Łącz się na podstawie części pola varchar pasującego do innego pola - sql-server-2008, join, warunkowe

Szukam dołączenia, aby zrobić lewe połączenie na dwóch stołach. Opis łańcucha w jednej tabeli zawiera identyfikator UID innej tabeli. Chcę wykonać lewe połączenie tylko wtedy, gdy opis pasuje do UID. Muszę zwrócić wszystkie rekordy w tabeli Transakcje. Czy możliwe jest użycie instrukcji IF lub warunkowej do dołączenia tabel, w przeciwnym razie pozostawienie pól jako pustych?

Oto skrzypce: http://sqlfiddle.com/#!3/aaa38/5

Tabela transakcji:

posted_date  person_id  description
2015-11-01    2         BZ#1414 Description 1414
2015-11-01    2         Another type of transaction with spaces in it
2015-11-01    3         BZ#1313 Another description 1313
2015-11-01    3         Another_description_without_spaces

Tabela szczegółów transakcji:

id    person_id   description
1414    2         additional stuff for 1414
1313    3         additional stuff for 1313

Wyniki powinny wyglądać tak:

posted_date person_id   description     id   person_id  description
2015-11-01   2          BZ#1414 Des...  1414    2       additional...
2015-11-01   2          Another typ...  NULL    NULL    NULL
2015-11-01   3          BZ#1313 Ano...  1313    3       additional...
2015-11-01   3          Another_des...  NULL    NULL    NULL

Odpowiedzi:

0 dla odpowiedzi № 1

Łączenie się w ten sposób naprawdę oznacza, że ​​struktura tabeli Transakcje nie jest dobra (powinna istnieć osobna kolumna dla pola, którego można użyć do dołączenia do szczegółów transakcji).

Powiedziawszy to, wciąż możesz osiągnąć to, co chcesz. Możesz dołączyć, gdy zaczyna się opis BZ# a następnie dołącz do tego, co następuje, biorąc długość id, aby wyodrębnić liczbę. Jest to lepsze niż próba znalezienia spacji w opisie, ponieważ może nie być żadnych spacji.

Lewe sprzężenie zrobi resztę i wypełni pola z tran_details wartościami null, jeśli nie było dopasowania.

select *
from
transactions t
left join tran_details d
on t.person_id = d.person_id
and left(t.description, 3) = "BZ#"
and substring(t.description, 4, len(cast(d.id as nvarchar(50)))) = d.id

Zakładałem, że chcesz dołączyć, jeśli BZ# po nim następuje id z tabeli szczegółów.

SQL Fiddle


0 dla odpowiedzi nr 2

Poniższe zapytanie zadziała, o ile pierwsze 3 znaki to „BZ #” w kolumnie Transaction.Description

wybierz * z Transakcji t lewe sprzężenie zewnętrzneSzczegóły_transakcji td na t.person_id = td.person_id i left (t.description, 3) = „BZ #” i REPLACE (SUBSTRING (t.description, 0, CHARINDEX („”, t.description, 0)), „BZ #”, „”) = td.id