Mysql
 sql >> Baza danych >  >> RDS >> Mysql

ZNAJDŹ_IN_SET() kontra IN()

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

attachedCompanyIDs jest wartością skalarną, która jest rzutowana na INT (typ companyID ).

Obsada zwraca tylko liczby do pierwszej nie będącej cyfrą (w twoim przypadku przecinek).

Tak więc

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

W PostgreSQL , możesz rzutować łańcuch na tablicę (lub najpierw zapisać go jako tablicę):

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

a to nawet użyłoby indeksu na companyID .

Niestety to nie działa w MySQL ponieważ ta ostatnia nie obsługuje tablic.

Ten artykuł może Cię zainteresować (patrz #2 ):

Aktualizacja:

Jeśli istnieje jakiś rozsądny limit liczby wartości na listach oddzielonych przecinkami (powiedzmy, że nie więcej niż 5 ), więc możesz spróbować użyć tego zapytania:

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. ADDDATE() vs DATE_ADD() w MySQL:jaka jest różnica?

  2. MySQL:Szybki podział typów złączeń

  3. czy istnieje funkcja group_concat w ms-access?

  4. Generowanie losowego i unikalnego ciągu 8 znaków za pomocą MySQL

  5. Operand powinien zawierać 1 kolumnę – MySQL NIE JEST