sql >> Database teknologi >  >> RDS >> Mysql

FIND_IN_SET() vs IN()

SELECT  name
FROM    orders,company
WHERE   orderID = 1
        AND companyID IN (attachedCompanyIDs)

attachedCompanyIDs er en skalær værdi, som er castet ind i INT (type companyID ).

Castet returnerer kun tal op til det første ikke-ciffer (et komma i dit tilfælde).

Således,

companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)

I PostgreSQL , kan du støbe strengen ind i et array (eller gemme det som et array i første omgang):

SELECT  name
FROM    orders
JOIN    company
ON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE   orderID = 1

og dette ville endda bruge et indeks på companyID .

Desværre virker dette ikke i MySQL da sidstnævnte ikke understøtter arrays.

Du finder muligvis denne artikel interessant (se #2 ):

Opdatering:

Hvis der er en rimelig grænse for antallet af værdier i de kommaseparerede lister (f.eks. ikke mere end 5 ), så du kan prøve at bruge denne forespørgsel:

SELECT  name
FROM    orders
CROSS JOIN
        (
        SELECT  1 AS pos
        UNION ALL
        SELECT  2 AS pos
        UNION ALL
        SELECT  3 AS pos
        UNION ALL
        SELECT  4 AS pos
        UNION ALL
        SELECT  5 AS pos
        ) q
JOIN    company
ON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)


  1. Sådan henter du rækkeantallet for alle tabeller i en SQL SERVER-database

  2. Hvordan rettes fejl i pg_dump-versionen?

  3. PostgreSQL:Fjern attribut fra JSON-kolonnen

  4. SQL Server Internals:Problematiske Operatører Pt. I – Scanninger