Heim >Datenbank >MySQL-Tutorial >FIND_IN_SET() vs. IN(): Wann sollte ich jedes für durch Kommas getrennte Werte verwenden?

FIND_IN_SET() vs. IN(): Wann sollte ich jedes für durch Kommas getrennte Werte verwenden?

DDD
DDDOriginal
2024-12-25 21:35:16934Durchsuche

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

FIND_IN_SET() vs. IN(): Das Abfrage-Rätsel enthüllen

Im Bereich der Datenbankabfrage ist es wichtig, die Nuancen zwischen verschiedenen Funktionen zu verstehen entscheidend. Eine solche Unterscheidung ergibt sich beim Vergleich von FIND_IN_SET() und IN(), insbesondere beim Abfragen von Werten, die als durch Kommas getrennte Zeichenfolgen gespeichert sind.

Die Abfragediskrepanz

Betrachten Sie zwei Tabellen: „orders“ mit einer Spalte „attachedCompanyIDs“, die durch Kommas getrennte Firmenkennungen enthält, und „company“ mit einer Spalte „companyID“ und entsprechende Firmennamen. Die folgende Abfrage ruft mit FIND_IN_SET() effektiv die mit einer Bestellung verknüpften Firmennamen ab:

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

Eine ähnliche Abfrage mit IN() liefert jedoch unerwartete Ergebnisse:

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

Die versteckte Falle

Die Hauptursache liegt darin, wie MySQL mit durch Kommas getrennten Werten umgeht, wenn angehängte Firmen-IDs umgewandelt werden in eine ganze Zahl umwandeln. Bei der Umwandlung werden Zahlen an der ersten Nicht-Ziffer abgeschnitten, wodurch die Zeichenfolge effektiv auf den ersten durch Kommas getrennten Wert reduziert wird.

Beispiel: Wenn „attachedCompanyIDs“ auf „1,2,3“ gesetzt ist, führt die IN()-Abfrage falsch aus wird zu:

companyID IN (1)

Dies erklärt, warum die IN()-Abfrage nur den ersten Firmennamen zurückgibt, während FIND_IN_SET() alle zurückgibt drei.

Überwindung der Einschränkung

Um dieses Problem zu beheben, sollten Sie alternative Ansätze in Betracht ziehen, die durch Kommas getrennte Zeichenfolgen angemessen verarbeiten. In PostgreSQL können Arrays verwendet werden:

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

Arrays werden in MySQL leider nicht unterstützt. Für eine begrenzte Anzahl von Werten (z. B. weniger als 5) ist eine Problemumgehung durch Cross-Join und String-Manipulation möglich:

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)

Das obige ist der detaillierte Inhalt vonFIND_IN_SET() vs. IN(): Wann sollte ich jedes für durch Kommas getrennte Werte verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn