sql >> Database >  >> RDS >> Mysql

FIND_IN_SET() versus IN()

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

attachedCompanyIDs is een scalaire waarde die wordt gegoten in INT (type companyID ).

De cast geeft alleen getallen terug tot aan het eerste niet-cijfer (een komma in jouw geval).

Dus,

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

In PostgreSQL , je zou de string in een array kunnen casten (of deze in de eerste plaats als een array opslaan):

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

en dit zou zelfs een index gebruiken op companyID .

Helaas werkt dit niet in MySQL aangezien de laatste geen arrays ondersteunt.

Misschien vind je dit artikel interessant (zie #2 ):

Bijwerken:

Als er een redelijke limiet is voor het aantal waarden in de door komma's gescheiden lijsten (bijvoorbeeld niet meer dan 5 ), dus je kunt proberen deze zoekopdracht te gebruiken:

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. Hoe ORA-06512 op regelnummer op te lossen

  2. Psycopg2, Postgresql, Python:snelste manier om bulksgewijs in te voegen

  3. Hoe kan ik een parameter doorgeven aan een t-sql-script?

  4. Het totale aantal seconden extraheren uit een intervalgegevenstype