Compartir a través de


Cláusula SELECT (consulta NoSQL)

SE APLICA A: NoSQL

Todas las consultas constan de una cláusula SELECT y cláusulas FROM y WHERE opcionales, según los estándares de SQL ANSI. Normalmente, se enumera el origen en la cláusula FROM y la cláusula WHERE aplica un filtro en el origen para recuperar un subconjunto de elementos JSON. La cláusula SELECT luego proyecta los valores JSON solicitados en la lista seleccionada.

Sintaxis

SELECT <select_specification>  

<select_specification> ::=
      '*'
      | [DISTINCT] <object_property_list>
      | [DISTINCT] VALUE <scalar_expression> [[ AS ] value_alias]  
  
<object_property_list> ::=
{ <scalar_expression> [ [ AS ] property_alias ] } [ ,...n ]

Argumentos

Descripción
<select_specification> Propiedades o valor que se van a seleccionar para los resultados.
'*' Especifica que se debe recuperar el valor sin cambios. En particular, si el valor procesado es un objeto, se recuperan todas las propiedades.
<object_property_list> Especifica la lista de propiedades que se recuperan. Cada valor devuelto es un objeto con las propiedades especificadas.
VALUE Especifica que se debe recuperar el valor JSON en lugar del objeto JSON completo. Este argumento, a diferencia de <property_list>, no encapsula el valor proyectado en un objeto.
DISTINCT Especifica que se deben quitar los duplicados de las propiedades proyectadas.
<scalar_expression> Expresión que representa el valor que hay que calcular. Para más información, consulte la sección expresiones escalares para obtener más información.

Ejemplos

En este primer ejemplo se seleccionan dos valores de cadena estáticos y se devuelve una matriz con un único objeto que contiene ambos valores. Dado que los valores no tienen nombre, se usa un número generado secuencial para asignar un nombre al campo json equivalente.

SELECT "Adventure", "Works"
[
  {
    "$1": "Adventure",
    "$2": "Works"
  }
]

En este ejemplo siguiente, se usa la proyección JSON para ajustar la estructura exacta y los nombres de campo del objeto JSON resultante. Aquí, se crea un objeto JSON con campos denominados department y team. El objeto JSON externo sigue sin nombre, por lo que se usa un número generado ($1) para asignar un nombre a este campo.

SELECT {
    department: "Sales",
    team: "Field sales"
}
[
  {
    "$1": {
      "department": "Sales",
      "team": "Field sales"
    }
  }
]

En este ejemplo se muestra la aplanación del conjunto de resultados del ejemplo anterior para simplificar el análisis. La palabra clave VALUE se usa aquí para evitar el ajuste de los resultados en otro objeto JSON.

SELECT VALUE {
    department: "Sales",
    team: "Field sales"
}
[
  {
    "department": "Sales",
    "team": "Field sales"
  }
]

En este ejemplo, la palabra clave VALUE se usa con una cadena estática para crear una matriz de cadenas como resultado.

SELECT VALUE "Sales"
[
  "Sales"
]

En este ejemplo final, supongamos que hay un contenedor con dos elementos con varios campos de distintos tipos de datos.

[
  {
    "team": "Field sales",
    "identity": {
      "name": "Parker McLean"
    },
    "contact": [
      "206-555-0147"
    ]
  },
  {
    "team": "Field sales",
    "identity": {
      "name": "Beibit Shayakhmet"
    },
    "contact": [
      "206-555-0178"
    ]
  }
]

Esta consulta de ejemplo final usa una combinación de una cláusula SELECT, la palabra clave VALUE, una cláusula FROM y una proyección JSON para realizar una consulta común con los resultados transformados en un objeto JSON para que el cliente analice.

SELECT VALUE {
    name: e.identity.name,
    team: e.team,
    phone: e.contact[0]
}
FROM
    employees e
[
  {
    "name": "Parker McLean",
    "team": "Field sales",
    "phone": "206-555-0147"
  },
  {
    "name": "Beibit Shayakhmet",
    "team": "Field sales",
    "phone": "206-555-0178"
  }
]

Observaciones

  • La sintaxis SELECT * solo es válida si la cláusula FROM ha declarado exactamente un alias. SELECT * proporciona una proyección de identidad, que puede resultar útil si no se necesitan proyecciones. SELECT * solo es válida si se especifica cláusula FROM y se introdujo solo un origen de entrada.
  • Tanto como SELECT <select_list> SELECT * son "azúcar sintáctico" y se pueden expresar alternativamente mediante instrucciones simples SELECT :
    • SELECT * FROM ... AS from_alias ... equivale a: SELECT from_alias FROM ... AS from_alias ....
    • SELECT <expr1> AS p1, <expr2> AS p2,..., <exprN> AS pN [other clauses...] equivale a: SELECT VALUE { p1: <expr1>, p2: <expr2>, ..., pN: <exprN> }[other clauses...].