sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera rader där ID är i semikolonseparerad sträng från underfrågan MSSQL

Det här är ännu ett exempel på vikten av att normalisera dina data.
Att hålla flera datapunkter i en enda kolumn är nästan aldrig den korrekta designen, och med nästan aldrig menar jag ungefär 99,9999%.

Om du inte kan normalisera din databas kan du använda en lösning så här:

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) +';%'
)

Du kan inte använda IN operatorn eftersom den förväntar sig en lista med värden avgränsade med kommatecken, medan du försöker förse den med ett enda värde som är avgränsat med semikolon. Även om värdena i Project_ID var avgränsade med kommatecken skulle det fortfarande inte fungera.

Anledningen till att jag har lagt till ; på varje sida av Project_ID i båda tabellerna är det på detta sätt LIKE operatören returnerar true för vilken plats som helst hittar den Projects.Project_Id inuti Feedback.Project_Id . Du måste lägga till ; till Projects.Project_Id för att förhindra LIKE för att returnera true när du letar efter ett nummer som delvis matchar siffrorna i den avgränsade strängen. Överväg att leta efter 12 i en sträng som innehåller 1;112;455 - utan att lägga till avgränsaren till sökvärdet (12 i det här exemplet) LIKE operatören skulle returnera true .




  1. PG::Fel:FEL:ogiltig bytesekvens för kodning av UTF8:0xfc

  2. Återställ sekvens i jpa

  3. Migration från Oracle Database till MariaDB - A Deep Dive

  4. Mappning av PostgreSQL seriell typ med Hibernate-kommentarer