What This Table Is
The sys_choice table is the centralized dictionary for all choice field options across the entire ServiceNow platform. Every dropdown menu, radio button set, and select list pulls its options from this table. When you create a choice field on any table, the individual options are stored here as separate records.
This table is owned by the Platform module and supports the core data dictionary functionality. Each record represents a single choice option with a unique combination of name (table name) and element (field name). The value field contains what gets stored in the database, while label contains what users see on forms.
The sys_choice table doesn't extend any other table and no tables extend it. However, it has a critical relationship with sys_dictionary which defines the choice fields themselves, and sys_choice_set for managing choice sets that can be reused across multiple fields.
In large enterprise instances, this table typically contains 15,000-50,000+ records. Performance is generally good for lookups by name and element since these fields are indexed, but full table scans can be expensive due to the volume and the fact that every form load potentially triggers choice lookups.
When You'll Script Against This Table
You'll most commonly script against sys_choice in Script Includes for choice management utilities, Business Rules that need to validate choice values, and Client Scripts that dynamically filter or populate choice fields. Data imports and integrations frequently query this table to validate incoming choice values or build choice mappings. UI Actions and processors also hit this table when building dynamic forms or choice-dependent logic.
The admin role has full access to this table. Most other roles can read choice records but cannot modify them. The personalize_choices role allows users to add personal choice options. Global scope can access all choices, but scoped applications can only modify choices for fields in their scope.
Common scripting patterns:
- Validating user input against valid choice values before database writes
- Building dynamic reference qualifiers based on choice field values
- Creating choice-to-choice dependencies where one field's options depend on another
- Programmatically adding or deactivating choice options during customization
- Translating choice labels for multi-language implementations
- Building choice mappings for data imports from external systems
- Retrieving choice labels for display in reports or notifications
Table Gotchas
The value field stores what goes in the database, but sequence controls display order, not value. A choice with value='1' might display last if its sequence is 1000.
Inactive choices (inactive=true) still exist in the database and can still be set programmatically - they just don't appear in the UI choice list.
- The
namefield stores the table name, not a display name - use exact table names like 'incident' not 'Incident' - Choice values are always stored as strings, even for integer choice fields - your comparisons need to account for string coercion
- Language field controls translation - empty language means base language, specific language codes override for that locale
Queries without name + element filters are extremely expensive. Always filter by both fields when possible - never do full table scans on sys_choice.
- The
dependent_valuefield creates cascading choice dependencies but requires exact value matches, not labels
Enjoying this? Get one deep-dive per week.
Join 1,000+ ServiceNow pros — scripts, GlideRecord patterns, Flow Designer techniques, and career moves. Free.
Related Tables
The sys_dictionary table defines the choice fields themselves - you'll often query both tables together when building field management tools or validating field configurations. The sys_choice_set table manages reusable choice sets that can be applied to multiple fields, and choice_set field in sys_choice references it.
The sys_db_object table is commonly joined when you need to validate table names in choice records. For internationalization, sys_translated stores additional translations beyond the base language field functionality.
Any table with choice fields will be queried alongside sys_choice for validation or label lookup. Common examples include incident (state, priority, urgency), task (state), and sys_user for any custom choice fields added to user records.