Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwróć wiersze, w których ID jest ciągiem oddzielonym średnikami z podzapytania MSSQL

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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwracaj wiersze dokładnie w kolejności, w jakiej zostały wstawione

  2. T-SQL:Eksportuj do nowego pliku Excel

  3. Jak zamienić pierwszą literę rekordu na wielką literę w SQL

  4. Wczytaj wiele tabel z relacjami z t-sql do DataSet

  5. Nieprawidłowa nazwa kolumny błąd sql