Mysql
 sql >> база данни >  >> RDS >> Mysql

FIND_IN_SET() срещу IN()

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

attachedCompanyIDs е скаларна стойност, която се прехвърля в INT (тип companyID ).

Прехвърлянето връща само числа до първата нецифрена (запетая във вашия случай).

По този начин,

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

В PostgreSQL , можете да прехвърлите низа в масив (или да го съхраните като масив на първо място):

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

и това дори би използвало индекс на companyID .

За съжаление, това не работи в MySQL тъй като последният не поддържа масиви.

Може да ви е интересна тази статия (вижте #2 ):

Актуализация:

Ако има някакво разумно ограничение за броя на стойностите в списъците, разделени със запетая (да речем, не повече от 5 ), така че можете да опитате да използвате тази заявка:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализирайте стойност на колона, като замените част от низ

  2. Как да извлечете подниз от низ в PostgreSQL/MySQL

  3. Как мога да вмъкна данни в MySQL база данни?

  4. MySQL - колко реда мога да вмъкна в един оператор INSERT?

  5. 3 начина за намиране на позицията на подниз в низ в MySQL