it-swarm.com.de

Wie fragt man eine Tabellenspalte nach Werten ab, die mit einem nicht alphabetischen Zeichen beginnen?

Wie können Zeilen ausgewählt werden, die mit nicht alphabetischen Zeichen beginnen (alle "Sonderzeichen", einschließlich Leerzeichen und Unterstrichen)?

Ich weiß nicht, ob sich etwas ändert, aber my_table enthält auch Werte, die mit griechischen Buchstaben beginnen.

$query = $db->getQuery(true);
$query->clear();
$query
    ->select(array('id', 'last_name', 'first_name'))
    ->from($db->qn('#__my_table'))
    ->where($db->qn('last_name').' LIKE '. $db->q('[^a-zA-Z%]'))
    ->order('last_name, first_name ASC')
    ->setLimit($startrow, '100');
$db->setQuery($query);

Das Abfrageformular ist korrekt und gibt die korrekten Ergebnisse zurück, wenn ich es wie folgt einstelle: $ db-> q ('A%') Mein Fehler muss also bei der Regex liegen, aber ich kann nicht sehen woher?

BEARBEITEN NACH FRAGE

Ich versuche, ein Buchstabenmenü wie dieses zu erstellen A B C D ... Α Β Γ Δ ... #. Wenn Sie auf einen Buchstaben klicken, werden alle Nachnamen angezeigt, die mit diesem Buchstaben beginnen. Wenn Sie auf # Klicken, werden alle anderen "Nachnamen" zurückgegeben (Benutzer importieren die Nachnamen, sodass es sich um Sonderzeichen oder -zahlen, Leerzeichen oder Unterstriche handeln kann). .

Dieser Code ist für das Klicken auf # Gedacht, damit alle Nachnamen, die mit Englisch beginnen, und alle Nachnamen, die mit griechischen Zeichen beginnen, herausgefiltert werden. Wenn es eine andere Möglichkeit gibt, das zu kategorisieren, was ich brauche, bitte um Rat.

Ich habe NOT REGEXP '. $ Db-> q (' [A-Za-z%] ') (AKTUALISIERTER CODE UNTEN) gefunden, der die meiste Arbeit leistet, aber nicht filtert die griechischen Buchstaben.

$query = $db->getQuery(true);
    $query->clear();
    $query
        ->select(array('id', 'last_name', 'first_name'))
        ->from($db->qn('#__my_table'))
        ->where($db->qn('last_name').' NOT REGEXP '. $db->q('[A-Za-zα-ωΑ-Ω%]'))
        ->order('last_name, first_name ASC')
        ->setLimit($startrow, '100');
    $db->setQuery($query);

GELÖST

Ich konnte den richtigen Regex finden

$query = $db->getQuery(true);
$query->clear();
$query
    ->select(array('id', 'last_name', 'first_name'))
    ->from($db->qn('#__my_table'))
    ->where($db->qn('last_name').' NOT REGEXP '. $db->q('^[a-z|α-ω]'))
    ->order('last_name, first_name ASC')
    ->setLimit($startrow, '100');
$db->setQuery($query);
1
John

Brauchen Sie überhaupt eine where-Klausel? Versuchen Sie wirklich, Namen auszuschließen? Was sind die tatsächlichen Ausschlüsse, die Sie möchten?

Wenn Sie keine Namen filtern möchten, können Sie einfach die WHERE -Klausel in Ihrer Abfrage entfernen und alle Benutzer/Benutzernamen angeben.

Zweitens können Sie solche regulären Ausdrücke in LIKE nicht übergeben. Ich wette, Ihre obige Abfrage gibt überhaupt nichts zurück. Das liegt daran, dass Ihr WHERE nach Namen sucht, die mit [^a-zA-Z] Beginnen und danach alles haben können.

Im Gegensatz dazu sucht der LIKE 'A%' Nach allen Namen, die mit A beginnen und danach irgendetwas haben.

Wenn Sie Regex ausführen müssen, bietet MySQL REGEXP & NOT REGEXP & RLIKE.

MySQL-Dokumentation:

Es ist ein bisschen vage, was Sie filtern wollen ... Beginnen Namen mit Zahlen oder was?

In diesem Fall handelt es sich um eine MySQL-Beispielabfrage mit Regex, um Folgendes herauszufiltern:

$query
    ->select(array('id', 'username'))
    ->from($db->qn('#__users'))
    ->where($db->qn('username').' NOT REGEXP '. $db->q('^[0-9]'))
    ->order('username ASC')
    ->setLimit($startrow, '100');
1
FFrewin

Ich möchte die in der Frage bearbeitete OP-Lösung verfeinern. Damit die Forscher vergleichen und verstehen können, was passiert.

$query = $db->getQuery(true)
    ->select($db->qn(["id", "last_name", "first_name"])
    ->from($db->qn("#__my_table"))
    ->where($db->qn("last_name") . " REGEXP " . $db->q("^[^a-zα-ω]"))
    ->order($db->qn(["last_name", "first_name"]))
    ->setLimit((int)$limit, (int)$offset);
$db->setQuery($query);
  • Ich weiß nicht, dass Sie clear() brauchen, also entferne ich es.
  • Ich habe alle unnötigen qn() Aufrufe hinzugefügt, die Joomla Standards verlangt.
  • Ihre Regex-Logik sucht nach Zeilen, die nicht mit Ihren beiden Buchstabenbereichen beginnen. Um eine "negierte Zeichenklasse" zu schreiben, verwenden Sie ^ Direkt nach dem [. Innerhalb einer Zeichenklasse verwenden Sie keine Pipes, um Zeichenbereiche zu trennen, sondern setzen Sie sie einfach nebeneinander.
  • Wenn Sie eine negierte Zeichenklasse verwenden, können Sie NOT vor REGEXP ablegen.
  • Die Standardsortierrichtung ist ASC, daher können Sie diese Deklaration in Ihrer Abfrage weglassen.
  • Sie haben Ihre Start- und Grenzparameter vertauscht. Das Limit sollte vor dem Offset liegen. https://api.joomla.org/cms-3/classes/JDatabaseQueryLimitable.html#method_setLimit
0
mickmackusa