Rumah >pangkalan data >tutorial mysql >FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap untuk Nilai Dipisahkan Koma?
FIND_IN_SET() vs IN(): Membongkar Teka-teki Pertanyaan
Dalam bidang pertanyaan pangkalan data, memahami nuansa antara fungsi yang berbeza adalah penting. Satu perbezaan sedemikian timbul apabila membandingkan FIND_IN_SET() dan IN(), terutamanya apabila menanyakan nilai yang disimpan sebagai rentetan dipisahkan koma.
Percanggahan Pertanyaan
Pertimbangkan dua jadual: "pesanan" dengan lajur "attachedCompanyIDs" yang mengandungi pengecam syarikat yang dipisahkan koma dan "syarikat" dengan lajur "companyID" dan nama syarikat yang sepadan. Pertanyaan berikut secara berkesan mendapatkan semula nama syarikat yang dikaitkan dengan pesanan menggunakan FIND_IN_SET():
SELECT name FROM orders, company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Walau bagaimanapun, pertanyaan serupa menggunakan IN() menghasilkan keputusan yang tidak dijangka:
SELECT name FROM orders, company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Perangkap Tersembunyi
Punca utama terletak pada bagaimana MySQL mengendalikan nilai dipisahkan koma apabila menghantar attachedCompanyIDs ke dalam integer. Barisan memotong nombor pada bukan digit pertama, dengan berkesan mengurangkan rentetan kepada nilai dipisahkan koma pertama.
Sebagai contoh, dengan attachedCompanyIDs ditetapkan kepada '1,2,3', pertanyaan IN() tidak betul menjadi:
companyID IN (1)
Ini menerangkan sebab pertanyaan IN() hanya mengembalikan nama syarikat pertama, manakala FIND_IN_SET() mengembalikan ketiga-tiganya.
Mengatasi Pengehadan
Untuk menangani isu ini, pertimbangkan pendekatan alternatif yang mengendalikan rentetan dipisahkan koma dengan sewajarnya. Dalam PostgreSQL, tatasusunan boleh digunakan:
SELECT name FROM orders JOIN company ON companyID = ANY(('{' || attachedCompanyIDs || '}')::INT[]) WHERE orderID = 1
Malangnya, tatasusunan tidak disokong dalam MySQL. Untuk bilangan nilai yang terhad (katakan, kurang daripada 5), penyelesaian boleh dilakukan menggunakan sambung silang dan manipulasi rentetan:
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)
Atas ialah kandungan terperinci FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap untuk Nilai Dipisahkan Koma?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!