Erweiterte Abfragen mit der ServiceNow-API

Mit erweiterten Abfragen in der REST-API von ServiceNow legst du genau fest, welche Datensätze abgerufen, gefiltert und von externen Werkzeugen verarbeitet werden. Mit der Encoded-Query-Syntax in sysparm_query bildest du komplexe WHERE-Logik wie in SQL nach, mit UND/ODER-Kombinationen, gruppierten Bedingungen, relativen Datumsfiltern, Textsuchen und Listenoperationen. Operatoren wie ^, ^OR und ^NQ sowie Parameter für seitenweises Lesen und Anzeigewerte ermöglichen schnelle, saubere und skalierbare Integrationen zwischen ServiceNow und Analyseplattformen wie Noreja.

In Noreja begrenzt du, welche ServiceNow-Datensätze ein Objekt liest, mit seiner WHERE-Klausel im Entitäten-Builder; siehe Objekte und Beziehungen konfigurieren. Bei einer ServiceNow-Datenquelle nimmt dieses Feld eine Encoded Query von ServiceNow auf, ohne vorangestelltes sysparm_query=. Noreja schickt sie mit jeder Anfrage für die Tabelle des Objekts und setzt die übrigen Anfrageparameter (Felder, Seitengröße, Offset) selbst. Die Klausel gilt nur für die eigene Tabelle des Objekts, nicht für verbundene Tabellen. Diese Seite erklärt die Syntax.

Die offizielle Referenz von ServiceNow: Encoded Query Strings (ServiceNow-Dokumentation) und die Abfrageparameter der Table API (ServiceNow-Dokumentation).

Grundlagen von „WHERE“ in ServiceNow (Encoded Query)

In der REST Table API von ServiceNow übergibst du in sysparm_query einen einzigen String, der wie eine SQL-WHERE-Klausel wirkt. Er heißt Encoded Query.

Feld + Operator + Wert, verbunden durch Zirkumflexe (^):

fieldOPvalue^field2OPvalue2...

  • UND: ^
  • ODER: ^OR
  • ODER-Gruppen / getrennte, unabhängige Klauseln: ^NQ

Wenn du die Table API selbst aufrufst, zum Beispiel um eine Abfrage zu testen, bevor du sie in Noreja einträgst, verwendest du typischerweise auch hilfreiche Parameter wie:

  • sysparm_fields=... (Spalten auswählen)
  • sysparm_limit=... (Zeilenlimit)
  • sysparm_display_value=true (Anzeigewerte zurückgeben)
  • sysparm_exclude_reference_link=true (übersichtlichere Referenzen)
  • sysparm_query_no_domain=true (wenn du die Domänentrennung ignorieren musst)

In die WHERE-Klausel von Noreja trägst du nur die Encoded Query ein.

Operatoren im Überblick

Zweck

Encoded-Operator

Beispiel

Gleich

=

state=2

Ungleich

!=

state!=6

Größer / kleiner

>, <, >=, <=

priority<=2

In Liste

IN (kommagetrennt)

priorityIN1,2,3

Nicht in Liste

NOT IN

assignment_groupNOT INd625dc6c6fdd...

Enthält (ohne Groß-/Kleinschreibung)

LIKE oder CONTAINS

short_descriptionLIKEemail

Beginnt mit

STARTSWITH

caller_id.emailSTARTSWITHjohn

Endet mit

ENDSWITH

u_reference_idENDSWITH-2025

Leer / nicht leer

ISEMPTY, ISNOTEMPTY

closed_atISEMPTY

Instanz von (Klasse)

INSTANCEOF

sys_class_nameINSTANCEOFtask

Zwischen zwei Daten (über zwei Operatoren)

>= und <=

sys_updated_on>=2025-08-01^sys_updated_on<=2025-08-23 23:59:59

Hinweise:

  • LIKE und CONTAINS werden für Teilstring-Treffer meist gleichwertig verwendet.
  • Die meisten Textvergleiche unterscheiden nicht zwischen Groß- und Kleinschreibung.
  • Werte mit Leerzeichen oder Sonderzeichen müssen in der endgültigen Anfrage URL-codiert sein. In Noreja gibst du die Abfrage so ein, wie sie ist; Noreja codiert sie, wenn es die Anfrage schickt.

Logik aufbauen: UND, ODER, Gruppierung

UND (^)

active=true^priority<=2

ODER (^OR)

priority=1^ORpriority=2

Tipp: Du kannst viele ^OR...-Teile aneinanderhängen.

Gruppieren mit ^NQ

^NQ beginnt eine neue Abfrageklausel, die mit der gesamten vorherigen Klausel per ODER verknüpft wird. Das ist der Trick für „(A UND B) ODER (C UND D)“. Encoded Queries kennen keine Klammern; ^NQ übernimmt die Gruppierung.

active=true^priority=1^NQstate=2^assignment_group=287ebd7da9fe198100f92cc8d1d2154e

Zu lesen als: (active=true AND priority=1) OR (state=2 AND assignment_group=...).

Textoperationen und „Platzhalter“

Mit LIKE verwendest du weder % noch *; der Operator selbst bedeutet schon einen Teiltreffer.

  • Enthält: short_descriptionLIKEemail
  • Beginnt mit: u_ticket_idSTARTSWITHABC-
  • Endet mit: u_ticket_idENDSWITH-42
  • Enthält nicht: short_descriptionDOESNOTCONTAINphish

Musst du Sonderzeichen wörtlich treffen (etwa ^ innerhalb eines Werts), codiere sie in der Anfrage als URL. In den Listenfiltern von ServiceNow siehst du vielleicht Escaping mit ``; bei REST verlässt du dich auf die URL-Codierung.

Datumswerte und relative Zeit

Du kannst mit absoluten Zeitstempeln vergleichen (in der Zeitzone der Instanz) oder die relativen Datumsmakros von ServiceNow verwenden:

Absolut

sys_updated_on>=2025-08-01 00:00:00^sys_updated_on<=2025-08-23 23:59:59

Relativ (serverseitige JS-Makros)

sys_updated_on>=javascript:gs.daysAgoStart(7)

Gängige Makros:

  • gs.daysAgoStart(n), gs.daysAgoEnd(n)
  • gs.beginningOfLastMonth(), gs.endOfLastMonth()
  • gs.hoursAgoStart(n) usw.

Sie sind praktisch für „letzte 7 Tage“, „heute“, „diesen Monat“ usw., ohne fest eingetragene Datumswerte.

Wie du Zeitstempel direkt in Noreja umwandelst, erklärt Zeitstempel: Formate, Vorschau und Verteilung.

Seitenweises Lesen, Felder und Anzeigewerte

Diese Parameter sind wichtig, wenn du die Table API selbst aufrufst; Noreja setzt Felder, Seitengröße und Offset selbst.

  • Limit: sysparm_limit=100 (der Standardwert der Table API ist 10.000)
  • Offset: sysparm_offset=0 (selbst seitenweise abrufen)
  • Felder: sysparm_fields=number,short_description,priority,state
  • Anzeigewerte: sysparm_display_value=true, um für Referenzen und Auswahlfelder lesbare Texte zu bekommen.

Gruppierte Logik mit ^OR und ^NQ

^OR verwenden (innerhalb einer Gruppe)

„Priorität 1 ODER 2, UND aktiv“

priority=1^ORpriority=2^active=true

Das wird von links nach rechts ausgewertet, mit impliziten UND zwischen den Zirkumflexen; ^OR hat eine niedrigere Priorität als die ausdrückliche Gruppierung, die du mit ^NQ erreichst. In den meisten echten Fällen verhält sich das wie beabsichtigt.

^NQ verwenden (zwischen Gruppen)

„(aktiv UND Priorität 1) ODER (Status On Hold UND in den letzten 7 Tagen aktualisiert)“

active=true^priority=1^NQstate=3^sys_updated_on>=javascript:gs.daysAgoStart(7)

Verwandte Artikel