Jaký je správný SQL pro použití, kde ID v seznamu a položky jsou s operátorem AND

Potřebuji příkaz SQL k použití operátoru IN v položkách s “ A „připojen.

SELECT * from tbl_Users WHERE id in [1,2,3] 

je ekvivalentní s:

SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3) 

Co potřebuji, je generovat pomocí operátoru IN (nebo ekvivalentního):

SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3) 

Protože shromažďuji všechna ID (např .: [1,2,3,4,5]) v jednom řetězci a vyhledejte jej v databázi.

Další vysvětlení:

ID je vždy primární klíč

Případ je, že mám tabulku, která obsahuje všechny země, a každá země má několik samostatných elektrických standardů.

Příklad: Německo vyžaduje vždy „standard1“ a „standard2“ USA vyžaduje vždy „Standard1“ a „standard3“ Francie vyžaduje vždy „Standard2“

Pokud uživatel v aplikaci C # hledá země, která má „Standard2“, měl by mu systém dát Německo a Francii.

ALE Pokud uživatel chce země se standardem „Standard1“ AND „standard2“, systém by mu měl dát pouze Německo. -> z důvodu „AND“

Můj dotaz byl

Select * from [tables and joins] where STANDARD_id IN [1,2] 

[1,2] je zřetězený seznam, který si uživatel již vybral ze seznamu standardů.

Komentáře

  • Pokud je id primární klíč, pak WHERE (id=1) AND (id = 2) AND (id = 3) vrátí 0 řádků. Vždy.
  • Pokud id není primární nebo jedinečný klíč, pravděpodobně budete chtít relační dělení. O jaký případ jde?
  • I když id není jedinečný, může to být pouze 1 NEBO 2 NEBO 3 na libovolném jednom řádku.
  • myslím nyní ji můžeme zavřít jako duplikát: Hledat ve stejném ID napříč několika řádky
  • Nebo možná tento, který má více způsobů, jak to udělat it a nadpis, který se podobá nadpisu zde: Aby se klauzule IN chovala jako klauzule AND

Odpověď

Myslím, že to, co se snažíte udělat, je relační rozdělení . Zde je nejlepší vysvětlení, které jsem našel

https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

Upřímně tomu zatím úplně nerozumím, ale věřím, že by to mělo fungovat (pomocí mezilehlé tabulky):

CREATE TABLE tblCountry ( countryId int, countryName nvarchar(100) ) INSERT INTO tblCountry SELECT 1, "Germany" UNION SELECT 2, "United States" UNION SELECT 3, "France" CREATE TABLE tblStandards ( standardId int, standardName nvarchar(100) ) INSERT INTO tblStandards SELECT 1, "standard_1" UNION SELECT 2, "standard_2" UNION SELECT 3, "standard_3" CREATE TABLE tblCountryStandards ( countryId int, standardId int ) INSERT INTO tblCountryStandards SELECT 1, 1 UNION SELECT 1, 2 UNION SELECT 2, 1 UNION SELECT 2, 3 UNION SELECT 3, 2 SELECT countryName FROM tblCountry INNER JOIN tblCountryStandards ON tblCountry.countryId = tblCountryStandards.countryId INNER JOIN tblStandards ON tblStandards.standardId = tblCountryStandards.standardId WHERE tblStandards.standardId IN (1, 2) -- unique standards selected by user GROUP BY tblCountry.countryName HAVING COUNT(DISTINCT tblStandards.standardId) = 2 -- number of standards selected by user above 

Toto je založeno na vašem příkladu, ale Testoval jsem více kombinací a funguje to, pokud se změnily komentované hodnoty.

Existuje mnoho dalších způsobů dělení, které jsou vysvětleny ve výše uvedeném odkazu – měli byste použít ten, který nejlépe vyhovuje vašim účelům.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *