Rumah > pangkalan data > tutorial mysql > FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap untuk Nilai Dipisahkan Koma?

FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap untuk Nilai Dipisahkan Koma?

DDD
Lepaskan: 2024-12-25 21:35:16
asal
934 orang telah melayarinya

FIND_IN_SET() vs. IN(): When Should I Use Each for Comma-Separated Values?

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)
Salin selepas log masuk

Walau bagaimanapun, pertanyaan serupa menggunakan IN() menghasilkan keputusan yang tidak dijangka:

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

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)
Salin selepas log masuk

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
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan