4D v15QUERY BY ATTRIBUTE |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v15
QUERY BY ATTRIBUTE
|
QUERY BY ATTRIBUTE ( Tabellennname {; KonjOp}; ObjektFeld ; AttributPfad ; SuchOp ; Wert {; *} ) | ||||||||
Parameter | Typ | Beschreibung | ||||||
Tabellennname | Tabelle |
![]() |
Tabelle für die Rückgabe einer Datensatzauswahl ohne Angabe Standardtabelle |
|||||
KonjOp | Operator |
![]() |
Operator zum Verbinden mehrfacher Suchen (wenn vorhanden) | |||||
ObjektFeld | Feld |
![]() |
Objektfeld für Suche nach Attributen | |||||
AttributPfad | String |
![]() |
Name oder Pfad des Attributs | |||||
SuchOp | Operator, String |
![]() |
Vergleichsoperator der Suche | |||||
Wert | Text, Zahl, Datum, Zeit |
![]() |
Wert für Vergleich | |||||
* | Operator |
![]() |
weiteres Suchkriterium | |||||
Kapitel: Suchen
QUERY BY ATTRIBUTE sucht nach Datensätzen, die zum Suchstring passen, definiert über die Parameter ObjektFeld, AttributPfad, SuchOp und Wert, und gibt eine Datensatzauswahl für Tabellenname zurück.
Hinweis: Weitere Informationen zu Objektfeldern (neu in 4D v15) finden Sie im Abschnitt Datenfeldtyp Objekt.
QUERY BY ATTRIBUTE ändert die aktuelle Auswahl von Tabellenname für den aktuellen Prozess und macht den ersten Datensatz der neuen Auswahl zum aktuellen Datensatz. Wird der Parameter Tabellenname weggelassen, gilt der Befehl für die Standardtabelle. Ist keine Standardtabelle vorhanden, tritt ein Fehler auf.
Der optionale Parameter KonjOp verbindet QUERY BY ATTRIBUTE Aufrufe in mehrfachen Suchen. Die logischen Operatoren sind dieselben wie im Befehl QUERY:
Konjunktion | Symbol für QUERY BY ATTRIBUTE |
UND | & |
ODER | | |
Außer | # |
Der Parameter KonjOp wird nicht bei einer einfachen Suche bzw. für den ersten Aufruf von QUERY BY ATTRIBUTE in einer mehrfachen Suche verwendet. Lassen Sie ihn in einer mehrfachen Suche weg, wird standardmäßig der Operator UND (&) verwendet.
In ObjektFeld übergeben Sie das Objektfeld, nach dessen Attribut(en) Sie suchen wollen. Gehört es zu einer Eine-Tabelle, definiert in Tabellenname mit einer automatischen oder manuellen Verknüpfung, kann ObjektFeld zu einer anderen Tabelle gehören.
In AttributPfad übergeben Sie den Namen oder Pfad des Attributs, dessen Werte Sie vergleichen wollen. Übergeben Sie ein einzelnes Attribut, z.B. "Alter", werden alle Attribute mit diesem Namen im Datensatz verglichen. Übergeben Sie einen Pfad, z.B. "Kinder.weiblich.Alter", werden nur dazu passende Attribute im Datensatz verglichen.
Ist ein Attribut "x" ein Array, sucht QUERY BY ATTRIBUTE nach Datensätzen mit einem Attribut "x", in dem mindestens ein Element zum Suchkriterium passt. Zur Suche in Array Attributen muss im Befehl QUERY BY ATTRIBUTE angegeben werden, dass Attribut "x" ein Array ist, d.h. an den Namen in AttributPfad wird ".[]" angefügt (siehe Beispiel 3).
Hinweise:
Der Parameter SuchOp ist der Vergleichsoperator zwischen ObjektFeld und Wert. Sie können folgende Symbole übergeben:
Vergleich | Symbol für QUERY BY ATTRIBUTE |
Ist gleich | = |
Ist ungleich | # |
Kleiner als | < |
Größer als | > |
Kleiner als oder gleich | <= |
Größer als oder gleich | >= |
Hinweis: Sie können den Vergleichsoperator auch in Textform angeben. Weitere Informationen dazu finden Sie unter dem Befehl QUERY.
Der Inhalt von Wert wird mit AttributPfad verglichen. Wert kann jeder Ausdruck sein, der denselben Datentyp wie AttributPfad bewertet. Er wird einmal zu Beginn der Suche bewertet und nicht für jeden Datensatz. Für eine Suche nach einem String innerhalb eines anderen (Suche mit "enthält") setzen Sie in Wert den Joker (@), um den gesuchten String zu isolieren, also z.B. "@Schmid@". In diesem Fall profitiert die Suche jedoch nur teilweise von dem Index (Kompaktheit der Datenspeicherung).
Die Struktur einer Suche nach Attribut lautet wie folgt:
QUERY BY ATTRIBUTE([Tabellenname];[Tabellenname]ObjektFeld;"Attribut1.Attribut2";=;Wert)
Hinweis: Für die Operatoren (außer #) gilt implizit, dass das Objektfeld ein Attribut enthält. Beim Operator # kann es jedoch undefiniert sein (siehe nächster Abschnitt).
Bei Objektfeldern wählt der Operator "#" Datensätze aus, für die kein Attribut des Feldes auf den angegebenen Wert zutrifft. Das bewertet 4D in diesem Kontext in ähnlicher Weise:
QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex")
QUERY BY ATTRIBUTE([Table] ;[Table]ObjectField ;"attribute1.attribute2";#;value)
QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].city";#;"paris")
Für mehrfache Suchen nach Attributen gelten folgende Regeln:
Hinweis: Jede Tabelle besitzt ihre eigenen aktuellen Suchläufe. Sie können also mehrere Suchläufe gleichzeitig anlegen, d.h. eine pro Tabelle. Für die eindeutige Zuordnung müssen Sie den Parameter Tabellenname angeben oder die Standardtabelle setzen.
Egal, auf welche Weise eine Suche definiert wurde, gilt folgendes:
Datumsangaben werden in Objekten gemäß den Einstellungen der Datenbank gespeichert; standardmäßig wird die Zeitzone berücksichtigt (siehe Selector JSON use local time unter dem Befehl SET DATABASE PARAMETER).
!1973-05-22! -> "1973-05-21T23:00:00.000Z"
Diese Einstellung wird auch beim Suchen berücksichtigt. Sie müssen sich nicht darum kümmern, wenn Sie Ihre Anwendung immer am gleichen Ort verwenden und die Einstellungen auf allen Rechnern, die auf die Daten zugreifen, gleich sind. Folgende Suche gibt dann z.B. Datensätze mit dem Attribut Geburtsdatum ist gleich !1973-05-22! (gesichert als "1973-05-21T23:00:00.00Z") korrekt zurück. Dieses Beispiel gilt für Deutschland GMT Winterzeit - 1 h: 22.Mai 1973 0:00 ist somit 21.Mai 1973 23:00:
QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Geburtsdatum";=;!1973-05-22!)
Wollen Sie nicht die GMT Einstellungen verwenden, schreiben Sie folgende Anweisung:
SET DATABASE PARAMETER(JSON use local time;0)
Beachten Sie, dass die Reichweite dieser Einstellung nur der Prozess ist. Führen Sie diese Anweisung aus, wird 1. Oktober 1965 auch als "1965-10-01T00:00:00.000Z" gespeichert. Sie müssen denselben Parameter jedoch vor dem Starten Ihrer Suchen setzen:
SET DATABASE PARAMETER(JSON use local time;0)
QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Geburtsdatum";=;!1976-11-27!)
In diesem Beispiel ist das Attribut "Alter" entweder ein String oder eine Ganzzahl. Wir wollen Personen im Alter 20 bis 29 finden. Die beiden ersten Zeilen suchen das Attribut als Ganzzahl (>=20 und < 30), die letzte Zeile sucht das Feld als String (startet mit "2", ist aber ungleich "2")
QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Alter";>=;20;*)
QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"Alter";<;30;*)
QUERY BY ATTRIBUTE([Persons];|;[Persons]OB_Info;"Alter";=;"2@";*)
QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"Alter";#;"2") // zuletzt kein * setzen, um die Ausführung zu starten
Mit dem Befehl QUERY BY ATTRIBUTE können Sie auch nach Datensätzen suchen, die bestimmte Attribute haben bzw. nicht haben. Dazu müssen Sie ein leeres Objekt verwenden:
//Finde Datensätze, für die im Objektfeld email definiert ist
C_OBJECT($undefined)
QUERY BY ATTRIBUTE([Persons];[Persons]Info;"email";#;$undefined)
//Finde Datensätze, für die im Objektfeld PLZ NICHT definiert ist
C_OBJECT($undefined)
QUERY BY ATTRIBUTE([Persons];[Persons]Info;"PLZ";=;$undefined)
Hinweis: Diese spezifische Syntax wird nicht in Attributen vom Typ Array unterstützt. Die Suche nach NULL Werten in Array Elementen liefert ein ungültiges Ergebnis.
Nach einem Feld mit Array Attributen suchen. Mit den beiden folgenden Datensätzen:
Datensatz 1:
[People]name: "martin"
[People]OB_Field:
"locations" : [ {
"kind":"office",
"city":"paris"
} ]
Datensatz 2:
[People]name: "smith"
[People]OB_Field:
"locations" : [ {
"kind":"home",
"city":"lyon"
} , {
"kind":"office",
"city":"paris"
} ]
... findet QUERY BY ATTRIBUTE Personen mit einer Adresse in "paris". Dazu schreiben Sie folgende Anweisung:
//Das Array Attribut mit der Syntax "[]"
QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].city";=;"paris")
//wählt "martin" und "smith"
Hinweis: Haben Sie im selben Array Attribut mehrere Kriterien definiert, wird das passende Kriterium nicht zwingend auf dasselbe Array Element angewendet. Im folgenden Beispiel gibt die Suche "smith" zurück, weil es ein Element "locations" mit "kind" ist gleich "home" hat und ein Element "locations" mit "city" ist gleich "paris", selbst wenn es nicht dasselbe Element ist:
QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].kind";=;"home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field;"locations[].city";=;"paris")
//wählt "smith"
Produkt: 4D
Thema: Programmiersprache
4D v15 - Upgrade (R-Release Edition) ( 4D v15)
Gesplittet : QUERY BY ATTRIBUTE ( 4D v15)