sql >> Databáze >  >> RDS >> Mysql

FIND_IN_SET() vs. IN()

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

attachedCompanyIDs je skalární hodnota, která je přetypována do INT (typ companyID ).

Přetypování vrací pouze čísla do první nečíslice (ve vašem případě čárka).

Tedy,

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

V PostgreSQL , můžete přenést řetězec do pole (nebo jej uložit jako pole na prvním místě):

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

a to by dokonce použilo index na companyID .

Bohužel to nefunguje v MySQL protože druhý nepodporuje pole.

Možná vás tento článek zaujme (viz #2 ):

Aktualizace:

Pokud existuje nějaký rozumný limit na počet hodnot v seznamech oddělených čárkami (řekněme ne více než 5 ), takže můžete zkusit použít tento dotaz:

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. Příklad replikace Oracle Streams krok za krokem

  2. SYSDATE() vs NOW() v MySQL:Jaký je rozdíl?

  3. Mám v MySQL použít datový typ datetime nebo timestamp?

  4. 2017 @ Somenines:Oslava příběhů našich zákazníků