sql >> Databáze >  >> RDS >> Sqlserver

Vrátí řádky, kde je ID v řetězci odděleném středníkem z poddotazu MSSQL

Toto je další příklad důležitosti normalizace dat.
Uchování více datových bodů v jednom sloupci není téměř nikdy správný návrh a téměř nikdy tím myslím asi 99,9999 %.

Pokud nemůžete normalizovat databázi, můžete použít toto řešení:

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

Nemůžete použít IN operátor, protože očekává seznam hodnot oddělený čárkou, zatímco se mu pokusíte dodat jedinou hodnotu, která je oddělena středníkem. I kdyby byly hodnoty v Project_ID odděleny čárkou, stále by to nefungovalo.

Důvod, proč jsem přidal ; na každé straně Project_ID v obou tabulkách je tímto způsobem LIKE operátor vrátí true pro jakékoli umístění najde Projects.Project_Id uvnitř Feedback.Project_Id . Musíte přidat ; na Projects.Project_Id abyste zabránili LIKE vrátíte true když hledáte číslo, které se částečně shoduje s čísly v řetězci s oddělovači. Zvažte hledání 12 v řetězci obsahujícím 1;112;455 – bez přidání oddělovače k ​​hledané hodnotě (12 v tomto příkladu) LIKE operátor vrátí true .




  1. Která je nejrychlejší? SELECT SQL_CALC_FOUND_ROWS FROM `tabulka` nebo SELECT COUNT(*)

  2. Proč se mysqli_query() láme? [mysqli_query():Nelze načíst mysqli]

  3. Jak odstranit úvodní nuly z dat v Oracle

  4. jak ověřit datový typ celého čísla v proceduře Oracle