To kolejny przykład znaczenia normalizacji danych.
Utrzymywanie wielu punktów danych w jednej kolumnie prawie nigdy nie jest prawidłowym projektem i prawie nigdy nie mam na myśli około 99,9999%.
Jeśli nie możesz znormalizować swojej bazy danych, możesz zastosować takie obejście:
SELECT *
FROM Projects p
WHERE EXISTS (
SELECT Project_ID
FROM Feedback F WHERE ID = 268
AND Project_ID IS NOT NULL
AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)
Nie możesz użyć IN
operatora, ponieważ oczekuje listy wartości oddzielonych przecinkiem, podczas gdy ty próbujesz podać mu pojedynczą wartość oddzieloną średnikiem. Nawet jeśli wartości w Project_ID byłyby oddzielone przecinkami, to i tak nie zadziała.
Powód, dla którego dodałem ;
po każdej stronie Project_ID
w obu tabelach jest to, że w ten sposób LIKE
operator zwróci true
dla dowolnej lokalizacji znajduje Projects.Project_Id
wewnątrz Feedback.Project_Id
. Musisz dodać ;
do Projects.Project_Id
aby zapobiec LIKE
aby zwrócić true
gdy szukasz liczby, która jest częściowym dopasowaniem do liczb w rozdzielonym ciągu. Rozważ szukanie 12 w ciągu zawierającym 1;112;455 - bez dodawania ogranicznika do wartości wyszukiwania (12 w tym przykładzie) LIKE
operator zwróci true
.