Compartir a través de


Referencia del lenguaje SQL de aceleración de consultas

La aceleración de consultas es compatible con un lenguaje ANSI de tipo SQL para expresar consultas sobre el contenido de blobs. El dialecto SQL de aceleración de consultas es un subconjunto de SQL ANSI, con un conjunto limitado de tipos de datos admitidos, operadores, etc., pero también se expande en SQL ANSI para admitir consultas en formatos de datos semiestructurados jerárquicos, como JSON.

Sintaxis de SELECT

La única instrucción SQL que admite la aceleración de consultas es la instrucción SELECT. Este ejemplo devuelve todas las filas para las que la expresión devuelve true.

SELECT * FROM table [WHERE expression] [LIMIT limit]

En el caso de los datos con formato CSV, table debe ser . Esto significa que la consulta se ejecutará en cualquier blob que se haya especificado en la llamada REST. En el caso de los datos con formato JSON, table es un "descriptor de tabla". Consulte la sección Descriptores de tabla de este artículo.

En el ejemplo siguiente, para cada fila para la que la expresión WHERE devuelva true, esta instrucción devolverá una nueva fila que se realiza a partir de la evaluación de cada una de las expresiones de proyección.

SELECT expression [, expression ...] FROM table [WHERE expression] [LIMIT limit]

Puede especificar una o varias columnas específicas como parte de la expresión SELECT (por ejemplo, SELECT Title, Author, ISBN).

Nota:

El número máximo de columnas específicas que puede usar en la expresión SELECT es 49. Si necesita que la instrucción SELECT devuelva más de 49 columnas, use un carácter comodín (*) para la expresión SELECT (por ejemplo: SELECT *).

En el ejemplo siguiente se devuelve un cálculo de agregado (por ejemplo, el valor medio de una columna determinada) sobre cada una de las filas para las que la expresión devuelve true.

SELECT aggregate_expression FROM table [WHERE expression] [LIMIT limit]

En el ejemplo siguiente se devuelven los desplazamientos adecuados para dividir un blob con formato CSV. Consulte la sección Sys.Split de este artículo.

SELECT sys.split(split_size)FROM BlobStorage

Tipo de datos

Tipo de datos Descripción
INT Entero con signo de 64 bits.
FLOAT Punto flotante de 64 bits ("precisión doble").
STRING Cadena Unicode de longitud variable.
timestamp A un momento dado.
BOOLEAN True o false.

Al leer valores de datos con formato CSV, todos los valores se leen como cadenas. Los valores de cadena se pueden convertir a otros tipos mediante expresiones CAST. Los valores se pueden convertir implícitamente a otros tipos en función del contexto. Para obtener más información, consulte Prioridad de tipo de datos (Transact-SQL).

Expresiones

Campos de referencia

En el caso de los datos con formato JSON o los datos con formato CSV con una fila de encabezado, es posible hacer referencia a los campos por su nombre. Los nombres de campos pueden ir entre comillas o sin comillas. Los nombres de campo entre comillas se incluyen entre caracteres de comillas dobles (") pueden contener espacios y distinguen mayúsculas de minúsculas. Los nombres de campo sin comillas no distinguen mayúsculas de minúsculas y no pueden contener caracteres especiales.

En los datos con formato CSV, también se puede hacer referencia a los campos por ordinal, precedidos por un carácter de subrayado (_). Por ejemplo, se puede hacer referencia al primer campo como _1 o al undécimo campo como _11. La referencia a campos por ordinal es útil para los datos con formato CSV que no contienen una fila de encabezado, en cuyo caso la única manera de hacer referencia a un campo determinado es por ordinal.

Operadores

Se admiten los siguientes operadores de SQL estándar:

Operator Descripción
= Compara la equivalencia de dos expresiones (es un operador de comparación).
!= Prueba si una expresión es distinta de otra expresión (es un operador de comparación).
<> Compara dos expresiones para "no igual que" (un operador de comparación).
< Compara dos expresiones para "menor que" (un operador de comparación).
<= Compara dos expresiones para "menor o igual que" (un operador de comparación).
> Compara dos expresiones para "mayor que" (un operador de comparación).
>= Compara dos expresiones para "mayor o igual que" (un operador de comparación).
+ Suma dos números. Este operador aritmético de suma también puede sumar un número, en días, a una fecha.
- Resta dos números (un operador aritmético de sustracción).
/ Divide un número entre otro (es un operador aritmético de división).
* Multiplica dos expresiones (es un operador aritmético de multiplicación).
% Devuelve el resto de un número dividido entre otro.
AND Realiza una operación lógica AND bit a bit entre dos valores enteros.
OR Realiza una operación OR bit a bit lógica entre dos valores de tipo entero especificados tal y como aparecen traducidos en expresiones binarias en instrucciones Transact-SQL.
NOT Niega la entrada de un valor booleano.
CAST Convierte una expresión de un tipo de datos a otro.
BETWEEN Especifica un intervalo que se va a probar.
IN Determina si un valor especificado coincide con algún valor de una subconsulta o una lista.
NULLIF Devuelve un valor NULL si las dos expresiones especificadas son iguales.
COALESCE Evalúa los argumentos en orden y devuelve el valor actual de la primera expresión que inicialmente no se evalúa como NULL.

Si los tipos de datos a la izquierda y a la derecha de un operador son diferentes, la conversión automática se realizará según las reglas especificadas aquí: Prioridad de tipo de datos (Transact-SQL).

El lenguaje SQL de aceleración de consultas solo admite un subconjunto muy pequeño de los tipos de datos descritos en ese artículo. Consulte la sección Tipos de datos de este artículo.

Conversiones

El lenguaje SQL de aceleración de consultas es compatible con el operador CAST según las reglas siguientes: Conversión de tipos de datos (motor de base de datos).

El lenguaje SQL de aceleración de consultas solo admite un subconjunto minúsculo de los tipos de datos descritos en ese artículo. Consulte la sección Tipos de datos de este artículo.

Funciones de cadena

El lenguaje SQL de aceleración de consultas admite las siguientes funciones de cadena de SQL estándar:

Función Descripción
CHAR_LENGTH Devuelve la longitud en caracteres de la expresión de cadena, si la expresión de cadena es de un tipo de datos de caracteres; de lo contrario, devuelve la longitud en bytes de la expresión de cadena (el entero más pequeño no es menor que el número de bits dividido entre 8). (Esta función es igual que la función CHARACTER_LENGTH).
CHARACTER_LENGTH Devuelve la longitud en caracteres de la expresión de cadena, si la expresión de cadena es de un tipo de datos de caracteres; de lo contrario, devuelve la longitud en bytes de la expresión de cadena (el entero más pequeño no es menor que el número de bits dividido entre 8). (Esta función es igual que la función CHAR_LENGTH).
LOWER Devuelve una expresión de caracteres después de convertir en minúsculas los datos de caracteres en mayúsculas.
UPPER Devuelve una expresión de caracteres con datos de caracteres en minúsculas convertidos a mayúsculas.
SUBSTRING Devuelve parte de una expresión de caracteres, binaria, de texto o de imagen en SQL Server.
TRIM Esto permite quitar el carácter de espacio char(32) u otros caracteres especificados del principio y del final de una cadena.
LEADING Quita el carácter de espacio char(32) u otros caracteres especificados del principio de una cadena.
TRAILING Quita el carácter de espacio char(32) u otros caracteres especificados del final de una cadena.

Estos son algunos ejemplos:

Función Ejemplo Resultado
CHARACTER_LENGTH SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage 7
CHAR_LENGTH SELECT CHAR_LENGTH(_1) from BlobStorage 1
LOWER SELECT LOWER('AbCdEfG') from BlobStorage abcdefg
UPPER SELECT UPPER('AbCdEfG') from BlobStorage ABCDEFG
SUBSTRING SUBSTRING('123456789', 1, 5) 23456
TRIM TRIM(BOTH '123' FROM '1112211Microsoft22211122') Microsoft

Funciones de fecha

Se admiten las funciones de datos de SQL estándar siguientes:

  • DATE_ADD
  • DATE_DIFF
  • EXTRACT
  • TO_STRING
  • TO_TIMESTAMP

Actualmente, se convierten todos los formatos de fecha del estándar IS08601.

Función DATE_ADD

El lenguaje SQL de aceleración de consultas admite año, mes, día, hora, minuto y segundo para la función DATE_ADD.

Ejemplos:

DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)

Función DATE_DIFF

El lenguaje SQL de aceleración de consultas admite año, mes, día, hora, minuto y, segundo para la función DATE_DIFF.

DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00') 

Función EXTRACT

En el caso de EXTRACT, además de la parte de la fecha compatible con la función DATE_ADD, el lenguaje SQL de aceleración de consultas admite timezone_hour y timezone_minute como parte de la fecha.

Ejemplos:

EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')

Función TO_STRING

Ejemplos:

TO_STRING(TimeStamp , format)
TO_STRING(CAST('1969-07-20T20:18Z' AS TIMESTAMP),  'MMMM d, y')

En esta tabla se describen las cadenas que se pueden usar para especificar el formato de salida de la función TO_STRING.

Cadena de formato Output
yy Año con formato de dos dígitos (1999 como "99")
y Año con formato de cuatro dígitos
aaaa Año con formato de cuatro dígitos
M Mes del año (1)
MM Mes completado con cero (01)
MMM Mes del año Mes del año (ENE)
MMMM Mes completo (mayo)
d Día del mes (1-31)
dd Día del mes de completado con cero (01-31)
a a. m. o p. m.
h Hora del día (1-12)
hh Horas del día completadas con cero (01-12)
H Hora del día (0-23)
HH Hora del día completada con cero (00-23)
m Minuto de la hora (0-59)
MM Minuto completado con cero (00-59)
s Segundo de minutos (0-59)
ss Segundos completados con cero (00-59)
S Fracción de segundos (0,1-0,9)
SS Fracción de segundos (0,01-0,99)
SSS Fracción de segundos (0,001-0,999)
X Desplazamiento en horas
XX o XXXX Desplazamiento en horas y minutos (+0430)
XXX o XXXXX Desplazamiento en horas y minutos (-07:00)
x Desplazamiento en horas (7)
xx o xxxx Desplazamiento en hora y minuto (+0530)
Xxx o xxxxx Desplazamiento en hora y minuto (+05:30)

Función TO_TIMESTAMP

Solo se admiten los formatos IS08601.

Ejemplos:

TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')

Nota

También puede usar la función UTCNOW para obtener la hora del sistema.

Expresiones de agregado

Una instrucción SELECT puede contener una o varias expresiones de proyección o una sola expresión de agregado. Se admiten las siguientes expresiones de agregado:

Expression Descripción
COUNT(*) Devuelve el número de registros que coinciden con la expresión de predicado.
COUNT(expression) Devuelve el número de registros cuya expresión no es NULL.
AVG(expresión) Devuelve el promedio de los valores no NULL de la expresión.
MIN(expression) Devuelve el valor mínimo no NULL de la expresión.
MAX(expression Devuelve el valor máximo no NULL de la expresión.
SUM(expression) Devuelve la suma de todos los valores no NULL de la expresión.

MISSING

El operador IS MISSING es el único no estándar que admite el lenguaje SQL de aceleración de consultas. En el caso de los datos JSON, si falta un campo de un registro de entrada determinado, el campo de expresión IS MISSING se evaluará como el valor booleano true.

Descriptores de tabla

En el caso de los datos CSV, el nombre de la tabla siempre es BlobStorage. Por ejemplo:

SELECT * FROM BlobStorage

En el caso de los datos JSON, hay disponibles opciones adicionales:

SELECT * FROM BlobStorage[*].path

Esta opción permite realizar consultas en subconjuntos de los datos JSON.

En el caso de las consultas JSON, puede mencionar la ruta de acceso en parte de la cláusula FROM. Estas rutas de acceso le ayudarán a analizar el subconjunto de datos JSON. Estas rutas de acceso pueden hacer referencia a valores de objeto y matriz JSON.

Facilitemos un ejemplo para comprender esto con más detalle.

Estos son los datos de ejemplo:

{
  "id": 1,
  "name": "mouse",
  "price": 12.5,
  "tags": [
    "wireless",
    "accessory"
  ],
  "dimensions": {
    "length": 3,
    "width": 2,
    "height": 2
  },
  "weight": 0.2,
  "warehouses": [
    {
      "latitude": 41.8,
      "longitude": -87.6
    }
  ]
}

Puede que le interese solo el objeto JSON warehouses de los datos anteriores. El objeto warehouses es un tipo de matriz JSON, por lo que puede mencionarlo en la cláusula FROM. La consulta de ejemplo puede tener un aspecto similar al siguiente.

SELECT latitude FROM BlobStorage[*].warehouses[*]

La consulta obtiene todos los campos, pero selecciona solo la latitud.

Si quiere tener acceso solo al valor del objeto JSON dimensions, puede usar la referencia a ese objeto en la consulta. Por ejemplo:

SELECT length FROM BlobStorage[*].dimensions

Esto también limita el acceso a los miembros del objeto dimensions. Si quiere tener acceso a otros miembros de campos JSON y valores internos de objetos JSON, puede usar una consulta como la que se muestra en el ejemplo siguiente:

SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]

Nota:

BlobStorage y BlobStorage[*] hacen referencia a todo el objeto. Sin embargo, si tiene una ruta de acceso en la cláusula FROM, deberá usar BlobStorage[*].path

Sys.Split

Se trata de una forma especial de la instrucción SELECT, que solo está disponible para los datos con formato CSV.

SELECT sys.split(split_size) FROM BlobStorage

Utilice esta instrucción en los casos en los que quiere descargar y después procesar registros de datos CSV en lotes. De este modo, puede procesar registros en paralelo en lugar de tener que descargar todos los registros al mismo tiempo. Esta instrucción no devuelve registros del archivo CSV. En su lugar, devuelve una colección de tamaños de lote. Después, puede usar cada tamaño de lote para recuperar un lote de registros de datos.

Use el parámetro split_size para especificar el número de bytes que quiere que contenga cada lote. Por ejemplo, si quiere procesar solo 10 MB de datos a la vez, la instrucción tiene el siguiente aspecto: SELECT sys.split(10485760)FROM BlobStorage, porque 10 MB es igual a 10 485 760 bytes. Cada lote contendrá tantos registros como quepan en esos 10 MB.

En la mayoría de los casos, el tamaño de cada lote será ligeramente mayor que el número especificado. Esto se debe a que un lote no puede contener un registro parcial. Si el último registro de un lote comienza antes del final del umbral, el lote será mayor para que pueda contener el registro completo. El tamaño del último lote probablemente será menor que el tamaño que especifique.

Nota:

El valor de split_size debe ser de al menos 10 MB (10485760).

Consulte también