| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | [discrete][[esql-keep]]=== `KEEP`The `KEEP` processing command enables you to specify what columns are returnedand the order in which they are returned.**Syntax**[source,esql]----KEEP columns----*Parameters*`columns`::A comma-separated list of columns to keep. Supports wildcards.See below for the behavior in case an existing column matches multiplegiven wildcards or column names.*Description*The `KEEP` processing command enables you to specify what columns are returnedand the order in which they are returned.Precedence rules are applied when a field name matches multiple expressions.Fields are added in the order they appear. If one field matches multiple expressions, the following precedence rules apply (from highest to lowest priority):1. Complete field name (no wildcards)2. Partial wildcard expressions (for example: `fieldNam*`)3. Wildcard only (`*`)If a field matches two expressions with the same precedence, the rightmost expression wins.Refer to the examples for illustrations of these precedence rules.*Examples*The columns are returned in the specified order:[source.merge.styled,esql]----include::{esql-specs}/docs.csv-spec[tag=keep]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-result]|===Rather than specify each column by name, you can use wildcards to return allcolumns with a name that matches a pattern:[source,esql]----include::{esql-specs}/docs.csv-spec[tag=keepWildcard]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-wildcard-result]|===The asterisk wildcard (`*`) by itself translates to all columns that do notmatch the other arguments.This query will first return all columns with a namethat starts with `h`, followed by all other columns:[source,esql]----include::{esql-specs}/docs.csv-spec[tag=keepDoubleWildcard]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-double-wildcard-result]|===The following examples show how precedence rules work when a field name matches multiple expressions.Complete field name has precedence over wildcard expressions:[source,esql]----include::{esql-specs}/docs.csv-spec[tag=keepCompleteName]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-complete-name-result]|===Wildcard expressions have the same priority, but last one wins (despite being less specific):[source,esql]----include::{esql-specs}/docs.csv-spec[tag=keepWildcardPrecedence]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-wildcard-precedence-result]|===A simple wildcard expression `*` has the lowest precedence.Output order is determined by the other arguments:[source,esql]----include::{esql-specs}/docs.csv-spec[tag=keepWildcardLowest]----[%header.monospaced.styled,format=dsv,separator=|]|===include::{esql-specs}/docs.csv-spec[tag=keep-wildcard-lowest-result]|===
 |