Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

TEMUKAN_IN_SET() vs IN()

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

attachedCompanyIDs adalah nilai skalar yang dimasukkan ke dalam INT (jenis companyID ).

Pemeran hanya mengembalikan angka hingga non-digit pertama (dalam kasus Anda koma).

Jadi,

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

Di PostgreSQL , Anda bisa memasukkan string ke dalam array (atau menyimpannya sebagai array di tempat pertama):

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

dan ini bahkan akan menggunakan indeks pada companyID .

Sayangnya, ini tidak berfungsi di MySQL karena yang terakhir tidak mendukung array.

Anda mungkin menganggap artikel ini menarik (lihat #2 ):

Pembaruan:

Jika ada batasan yang wajar pada jumlah nilai dalam daftar yang dipisahkan koma (misalnya, tidak lebih dari 5 ), sehingga Anda dapat mencoba menggunakan kueri ini:

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. phpMyAdmin melempar #2002 tidak dapat masuk ke server mysql phpmyadmin

  2. CURTIME() Contoh – MySQL

  3. Tabel Tunggal MySql, Pilih 7 hari terakhir dan sertakan baris kosong

  4. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/lib/mysql/mysql.sock' (2)

  5. Perbarui kolom di MySQL