Sintaxis SQL

Notas sobre palabras clave

Un bloque SQL puede contener varias cláusulas separadas por punto y coma.

Los bloques individuales se pueden utilizar para realizar las siguientes tareas con las siguientes palabras clave:

  1. Borrar selección: CLEAR SELECTION
  2. Establecer una variable escalar: LET
  3. Establecer una variable de lista: LIST
  4. Seleccionar objetos: SELECT
  5. Anular la selección de objetos (es decir, eliminar objetos de la selección): DESELECT
  6. Suprimir objetos: DELETE
  7. Cambiar los valores de los campos o variables: SET y UPDATE
  8. Generar una tabla de valores que se puede mostrar en una tabla o generar en un archivo CSV: SELECT

Con la excepción de los tres primeros:

Ahora vamos a proporcionar más información sobre las palabras clave:

  1. Borrar la selección

    Para borrar la selección, utilice la cláusula

    CLEAR SELECTION

  2. Establecer una variable escalar

    Para establecer una variable escalar, por ejemplo

    LET <variablename> = <value>

  3. Establecer una variable de lista

    Para establecer una variable de lista, como

    LIST <variablename> = <value>, <value>, <value>, <value>

  4. Seleccionar objetos

    Para seleccionar objetos, utilice la palabra clave SELECT, por ejemplo

    SELECT

    SELECT ALL

    SELECT SELECTED

    SELECT FROM conduit

    SELECT ALL FROM conduit

    SELECT SELECTED FROM conduit

    SELECT WHERE x > 0

    SELECT ALL WHERE x > 0

    SELECT SELECTED WHERE x > 0

    SELECT FROM conduit WHERE conduit_width > 250

    SELECT ALL FROM conduit WHERE conduit_width > 250

    SELECT SELECTED FROM conduit WHERE conduit_width > 250

    Si va a realizar la selección en la tabla activa con el modo de selección activa, la palabra clave SELECT se puede omitir, por ejemplo.

    x>0

  5. Anular selección de objetos

    Para anular la selección de objetos, utilice la palabra clave DESELECT

    DESELECT

    DESELECT ALL

    DESELECT SELECTED

    DESELECT FROM conduit

    DESELECT ALL FROM conduit

    DESELECT SELECTED FROM conduit

    DESELECT WHERE x > 0

    DESELECT ALL WHERE x > 0

    DESELECT SELECTED WHERE x > 0

    DESELECT FROM conduit WHERE conduit_width > 250

    DESELECT ALL FROM conduit WHERE conduit_width > 250

    DESELECT SELECTED FROM conduit WHERE conduit_width > 250

  6. Suprimir objetos

    Para suprimir objetos, utilice la palabra clave DELETE

    DELETE

    DELETE ALL

    DELETE SELECTED

    DELETE FROM conduit

    DELETE ALL FROM conduit

    DELETE SELECTED FROM conduit

    DELETE WHERE x > 0

    DELETE ALL WHERE x > 0

    DELETE SELECTED WHERE x > 0

    DELETE FROM conduit WHERE conduit_width > 250

    DELETE ALL FROM conduit WHERE conduit_width > 250

    DELETE SELECTED FROM conduit WHERE conduit_width > 250

  7. Cambiar el valor de los campos o variables

    Para cambiar el valor de los campos o variables, utilice la palabra clave SET. Es posible establecer más de un valor a la vez separando las asignaciones con comas.

    SET x = x – 100, y = y – 100

    SET x = x – 100, y = y – 100 WHERE ground_level > 20

    Para modificar la tabla activa y el modo de selección activo, se debe utilizar la palabra clave UPDATE

    UPDATE ALL SET x = x – 100, y = y - 100

    UPDATE SELECTED SET x = x – 100, y = y - 100

    UPDATE node SET x = x – 100, y = y - 100

    UPDATE ALL node SET x = x – 100, y = y - 100

    UPDATE SELECTED node SET x = x – 100, y = y – 100

    UPDATE ALL SET x = x – 100, y = y – 100 WHERE ground_level > 20

    UPDATE SELECTED SET x = x – 100, y = y – 100 100 WHERE ground_level > 20

    UPDATE node SET x = x – 100, y = y - 100100 WHERE ground_level > 20

    UPDATE ALL node SET x = x – 100, y = y – 100 100 WHERE ground_level > 20

    UPDATE SELECTED node SET x = x – 100, y = y – 100 100 WHERE ground_level > 20

  8. Generar una tabla de valores

    Para seleccionar un número de valores, utilice la palabra clave SELECT y, a continuación, sígalo con los valores que desea que se muestren separados por comas.

    SELECT node_id ,MAX(us_links.conduit_width), MIN(us_links.conduit_width)

    Es posible modificar el título dado a la columna en la tabla o en el archivo CSV utilizando la palabra clave AS, por ejemplo

    SELECT node_id AS title,MAX(us_links.conduit_width) as mymax,MIN(us_links.conduit_width) as mymin

    El título puede estar sin comillas, en cuyo caso no puede haber espacios ni caracteres no alfanuméricos, ni comillas, por ejemplo

    SELECT node_id AS title,MAX(us_links.conduit_width) as mymax,MIN(us_links.conduit_width) as '£% my min'

    Es posible modificar la tabla

    SELECT node_id AS title,MAX(us_links.conduit_width) as mymax,MIN(us_links.conduit_width) as mymin FROM node

    Los resultados se mostrarán en una tabla a menos que se especifique un archivo mediante la palabra clave INTO

    SELECT node_id AS title,MAX(us_links.conduit_width) as mymax,MIN(us_links.conduit_width) as mymin FROM node INTO FILE 'c:\temp\mynodes.csv'

    Es posible filtrar los objetos sobre los que se informará mediante la palabra clave WHERE

    SELECT node_id AS title,MAX(us_links.conduit_width) as mymax,MIN(us_links.conduit_width) as mymin FROM node WHERE MAX(us_links.conduit_width) > 450

    Es posible calcular resultados agregados sobre grupos de objetos

    SELECT MAX(MAX(us_links.conduit_width)) GROUP BY system_type

    Es posible limitar los resultados de los agregados notificados mediante la palabra clave HAVING

    SELECT MAX(MAX(us_links.conduit_width)) GROUP BY system_type HAVING MAX(MAX(us_links.conduit_width))<1000

Sintaxis SQL admitida

En la tabla siguiente se muestra la sintaxis SQL admitida en este producto de Autodesk. A continuación, se pueden encontrar notas adicionales.

Consulte el documento técnico SQL en InfoWorks WS Pro para obtener información completa sobre el uso de SQL y todas las funciones admitidas.

Texto del comentario

El texto del comentario se omite cuando se ejecuta la consulta.

/* Inicio del texto del comentario
*/ Final del texto del comentario

Funciones

INT(number)

Parte entera de un número.

FLOOR(number)

Entero más cercano menor o igual que el parámetro.

CEIL(number)

Entero más cercano mayor o igual que su parámetro.

FIXED(number to convert,number of decimal places) Dado un número y un número de decimales entre 0 y 8, convierta el número en una cadena con ese número de decimales, redondeando hacia arriba o hacia abajo según corresponda. Si el número de decimales es 0, la cadena no tendrá ningún separador decimal.

abs(x)

Toma el valor absoluto de x. La función devuelve x si x >= 0, -x en caso contrario

left(s,n)

Devuelve los primeros n caracteres de la cadena s o toda la cadena si n es mayor que la longitud de la cadena

right(s,n)

Devuelve los últimos n caracteres de la cadena s, o toda la cadena si n es mayor que la longitud de la cadena).

mid(s,n,m)

Devuelve la subcadena de la cadena s que contiene caracteres m que comienzan en la posición n, contando desde 1 como posición inicial

len(s)

Devuelve la longitud de la cadena s

iif(x,y,z)

Si la expresión x es verdadera, devuelve y de lo contrario devuelve z

nvl(x,y) Si x es nulo, devuelve y de lo contrario devuelve x

subst(s1,s2,s3)

Reemplaza la primera instancia de la cadena s2 en la cadena s1 por la cadena s3

Por ejemplo:

subst(node_id,'01','ND')

se aplica al ID de nodo "01880132" y devuelve "ND880132"

gsubst(s1,s2,s3)

Reemplaza todas las instancias de la cadena s2 en la cadena s1 por la cadena s3

Por ejemplo:

gsubst(node_id,'01','ND')

se aplica al ID de nodo "01880132" y devuelve "ND88ND32"

gensubst(s,regexp,format)

Reemplaza la cadena s por el formato definido si la expresión regular regxp coincide con la cadena s; de lo contrario, devuelve la cadena s sin cambios.

Por ejemplo:

gensubst(node_id,'(01)(..)(..)(.*)','ND\2\4a\1')

se aplica al nodo "01880132", devuelve "ND8832a01"

  • La expresión regular se puede utilizar para dividir la cadena en subexpresiones mediante paréntesis.
  • En el ejemplo anterior, '(01)(...)(...)(.*)' coincide con cualquier ID de nodo de al menos 6 caracteres que empiecen por 01. El primero (...) corresponde a los caracteres tercero y cuarto de la cadena, el segundo (...) al quinto y sexto y (.*) al resto de la cadena.
  • Si hay coincidencia, se devuelve una cadena en el formato definido; en este caso, \1 representa los valores de la primera subexpresión entre paréntesis '01', \2 representa los valores de la segunda subexpresión entre paréntesis (...) - '88', etc., hasta \9.
nl()

Devuelve un carácter de nueva línea

Por ejemplo, para configurar un campo de nota de tres líneas:

SET notes = 'Set'+NL()+'new'+NL()+'line'

yearpart(s)

YEARPART se aplica a/devuelve el año de una fecha. Si la fecha es 24/09/2007, YEARPART es 2007.

Nota: las funciones YEARPART, MONTHPART y DAYPART funcionan en campos de fecha y campos de cadena con formato de fecha. Se devuelve un cero si la cadena a la que se aplican no es una fecha.

monthpart(s)

MONTHPART se aplica a/devuelve el mes de una fecha. MONTHPART es 09 si tomamos el ejemplo anterior.

Nota: las funciones YEARPART, MONTHPART y DAYPART funcionan en campos de fecha y campos de cadena con formato de fecha. Se devuelve un cero si la cadena a la que se aplican no es una fecha.

daypart(s)

DAYPART se aplica a/devuelve el día de una fecha. En el ejemplo anterior, DAYPART es 24.

Nota: las funciones YEARPART, MONTHPART y DAYPART funcionan en campos de fecha y campos de cadena con formato de fecha. Se devuelve un cero si la cadena a la que se aplican no es una fecha.

NOW()

Función sin ningún parámetro que defina el presente. Esta función examina la fecha y la hora del equipo, de modo que las consultas SQL con NOW no se deben volver a escribir cada vez antes de ejecutarlas para que sean actuales.

DATEPART(date)

DATEPART devuelve la parte de fecha como una fecha (por ejemplo, elimina los minutos de las fechas).

TIMEPART(date)

TIMEPART devuelve la parte de hora de una fecha como un número de minutos después de medianoche.

YEARSDIFF(from,to)

YEARSDIFF devuelve el número de años completos entre dos fechas.

Nota: Las funciones YEARSDIFF, MONTHSDIFF y DAYSDIFF ignoran cualquier parte de los minutos de las fechas en cuestión.

MONTHSDIFF(from,to)

MONTHSDIFF devuelve el número de meses completos entre dos fechas.

Nota: Las funciones YEARSDIFF, MONTHSDIFF y DAYSDIFF ignoran cualquier parte de los minutos de las fechas en cuestión.

DAYSDIFF(from,to)

DAYSDIFF devuelve el número de días completos entre dos fechas.

Nota: Las funciones YEARSDIFF, MONTHSDIFF y DAYSDIFF ignoran cualquier parte de los minutos de las fechas en cuestión.

INYEAR(date,number)

INYEAR devuelve verdadero si la fecha es el año dado como un número.

Nota: Si alguno de los parámetros de las funciones INYEAR, INMONTH, INYEARS e INMONTHS no son números, la función devolverá false. Si el número no es un entero, se redondea al entero más cercano.

INMONTH(date,month,year)

INMONTH devuelve verdadero si la fecha está en el mes y año dados como números.

Nota: Si alguno de los parámetros de las funciones INYEAR, INMONTH, INYEARS e INMONTHS no son números, la función devolverá false. Si el número no es un entero, se redondea al entero más cercano.

INYEARS(date,startyear,endyear)

INYEARS devuelve verdadero si la fecha se encuentra en un año entre los años inicial y final inclusive.

Nota: Si alguno de los parámetros de las funciones INYEAR, INMONTH, INYEARS e INMONTHS no son números, la función devolverá false. Si el número no es un entero, se redondea al entero más cercano.

INMONTHS(date,startmonth,startyear,endmonth,endyear)

INMONTHS devuelve verdadero si la fecha se encuentra entre el mes inicial del año inicial y el mes final del año final inclusive.

Nota: Si alguno de los parámetros de las funciones INYEAR, INMONTH, INYEARS e INMONTHS no son números, la función devolverá false. Si el número no es un entero, se redondea al entero más cercano.

ISDATE(putative_date)

Si el campo es una fecha porque proviene de la base de datos, devuelve true, si es una cadena, devuelve true si se puede convertir en una fecha, de lo contrario, devuelve false.

MONTHYEARPART(date)

MONTHYEARPART devuelve la cadena "<month>/<year>".

YEARMONTHPART(date)

YEARMONTHPART devuelve la cadena "<mes>/<año>".

MONTHNAME(date)

MONTHNAME devuelve el nombre del mes (en la configuración regional activa).

SHORTMONTHAME(date)

SHORTMONTHNAME devuelve el nombre abreviado del mes (según lo determine la configuración regional y cómo lo abrevia Windows).

DAYNAME(date)

DAYNAME devuelve el nombre del día (en la configuración regional activa)..

SHORTDAYNAME(date)

SHORTDAYNAME devuelve el nombre abreviado del día (según lo determine la configuración regional y cómo lo abrevia Windows).

NUMTOMONTHNAME(n) Devuelve el nombre de mes dado un entero entre 1 y 12.
NUMTOSHORTMONTHNAME(n) Devuelve la versión corta de un nombre de mes (p. ej., ENE) dado un entero entre 1 y 12.
TODATE(year,month,day) Devuelve la fecha especificada como enteros para el año, el mes y el día.
TODATETIME(year,month,day,hours,minutes) Devuelve la fecha especificada como enteros para el año, el mes y el día.

Funciones de lista

El propósito de estas funciones es dividir valores en rangos, valores de puntuación, asignar valores en listas, etc.

AREF(n,list)

Si se proporciona una lista de variables de lista y un número entre 1 y la longitud de la lista, AREF devuelve el elemento enésimo de la lista.

LEN(list variable)

LEN devuelve el número de elementos de una variable de lista.

RINDEX(expression, list variable)

RINDEX es una función que solo se puede utilizar si la lista está ordenada. El propósito de la función RINDEX es, esencialmente, dividir los valores en "contenedores".

LOOKUP(expression, list variable)

Si no hay elementos en la lista y el valor de la expresión está entre 1 y n, LOOKUP devolverá el elemento adecuado de la lista.

MEMBER(expression, list variable)

MEMBER devuelve verdadero si el valor de la expresión es uno de los valores de la lista; en caso contrario, devuelve falso.

INDEX(expression, list variable)

Si el resultado de la expresión es el primer valor de la lista, INDEX devolverá 1, si es el valor del segundo, devolverá 2, si el resultado de la expresión no es la lista, devolverá 1.

TITLE(n,list)

TITLE proporciona títulos para los "contenedores" cuando RINDEX se utiliza para dividir valores en varios rangos.

Funciones matemáticas

LOG(x)

Calcula el registro (base 10) de x.

LOGE(x)

Calcula el registro (base e) de x.

EXP(x)

Calcula e^x.

SIN(x)

Calcula el signo de x.

COS(x)

Calcula el coseno de x.

TAN(x)

Calcula la tangente de x.

ASIN(x)

Calcula el signo inverso de x.

ACOS(x)

Calcula el coseno inverso de x.

ATAN(x)

Calcula la tangente inversa de x.

ATAN2(x,y)

Calcula la tangente inversa de x/y utilizando los signos de x e y para determinar el cuadrante.

GAMMALN(x)

Devuelve el LOG (base e) de la función gamma de x.

Funciones de agregado

Las funciones de agregado se utilizan para permitir el cálculo de valores basados en:

ANY

ANY devuelve verdadero si la expresión es verdadera para cualquier fila del campo de matriz, por ejemplo

ANY(details.code=’JDS’)

devolverá verdadero si alguna de las filas del campo de matriz de detalles tiene el código JDS; en caso contrario, devuelve falso.

La expresión entre paréntesis puede contener más de un campo de matriz, otros campos del objeto, constantes y funciones no agregadas, y todas ellas se pueden combinar con operadores aritméticos, de comparación y lógicos.

TODOS

ALL devuelve verdadero si la expresión es verdadera para todas las filas, los objetos o pasos temporales relacionados

COUNT

COUNT cuenta el número de filas, objetos relacionados o pasos temporales para los que la expresión es verdadera.

MAX

MAX devuelve el valor máximo (número, fecha o cadena) de todas las filas, objetos relacionados o pasos temporales.

MIN

MIN devuelve el valor mínimo (número, fecha o cadena) de todas las filas, objetos relacionados o pasos temporales.

MAX y MIN funcionan en campos numéricos, de fecha y de cadena. En el caso de los campos de cadena, la comparación entre cadenas se realiza en función del idioma en el que se haya configurado la instalación de Windows.

AVG

AVG devuelve la media de todos los valores no nulos de la expresión (solo numéricos) para todas las filas/objetos relacionados/pasos temporales.

FIRST

FIRST devuelve el valor de la expresión para la primera fila, objeto relacionado o paso temporal.

LAST

LAST devuelve el valor de la expresión para la primera fila, objeto relacionado o paso temporal. Por tanto, al calcular el valor, se tiene en cuenta uno de los registros del campo de matriz.

Operadores aritméticos

+-*/><=>=<=<>

Todos estos operadores hacen lo que se espera de los números. <> significa "no igual a".

Además, + se puede utilizar para concatenar cadenas. + es el único operador aritmético que tiene un significado especial para cadenas.

^

El operador ^ significa "elevar a la potencia". Por ejemplo, x^2 significa x al cuadrado.

%

a % b da el resto de a/b, por ejemplo, el año % 10 da el último dígito del año.

Operadores lógicos

ANDORNOT

Intuitivo.

Otros operadores

IS NULL

Se evalúa como verdadero si un campo es NULL

IS NOT NULL

Se evalúa como verdadero si un campo no es NULL

LIKE

Los dos caracteres especiales que se pueden utilizar con LIKE son:

  • * significar coincidir con cualquier elemento
  • ? significa coincidir con un carácter

Solo uno de cada dos caracteres de una cadena coincide con sí mismo.

La coincidencia es como en DOS, es decir:

  • LIKE '*' coincide con cualquier elemento
  • LIKE 'ABC*' coincide con cualquier elemento que comience con ABC
  • LIKE '???' coincide con cualquier cadena de 3 caracteres

Al igual que con DOS, una vez que se pulsa un *, todo coincide. Por lo tanto, no puede hacer cosas como "*AB" para encontrar cosas con AB al final, o LIKE "*AB*" para encontrar algo con AB en algún lugar de la cadena.

Tenga en cuenta que este comportamiento de LIKE es diferente del comportamiento de Microsoft Access.

MATCHES

MATCHES permite realizar búsquedas más complejas que el operador LIKE mediante expresiones regulares.

Los elementos de sintaxis importantes son:

  • . - (punto) cualquier carácter alfanumérico
  • * - cero o más del carácter anterior. Por lo tanto, B* coincidirá con cero o más Bs
  • + - uno o más del carácter anterior. B+ coincidirá con una o más B
  • ? - cero o uno del carácter anterior. Entonces B? coincidirá con cero o una B

La correspondencia funciona como se indica a continuación:

  • MATCHES '.*' coincide con cualquier elemento
  • MATCHES 'ABC.*' coincide con cualquier cadena que comience por ABC
  • MATCHES 'ABC.+' coincide con cualquier cadena que comience por ABC seguida de al menos un carácter más
  • MATCHES '.*ABC.*' coincide con cualquier cadena que contenga ABC
  • MATCHES '.*ABC' coincide con cualquier cadena que termine en ABC
  • MATCHES 'RS*' coincide con cualquier cadena que comience por R seguida de cero o más s

Las expresiones regulares son potentes y se puede hacer mucho más con ellas que con los ejemplos básicos que se muestran arriba. Para obtener más información sobre las expresiones regulares y su sintaxis, consulte este artículo en Wikipedia.

Constantes

True

False

NULL

Intuitivo.

Funciones añadidas (solo resultados)

Es posible utilizar las funciones añadidas en todos los resultados de la simulación en lugar de solo una instantánea mediante tsr en lugar de sim.

DURATION

DURATION: tiempo (en minutos) durante el que la expresión es verdadera (solo resultados)

INTEGRAL

integral: Devuelve la suma del valor de la expresión en cada paso temporal multiplicada por la longitud del paso temporal en minutos.

WHENEARLIEST

WHENEARLIEST: la hora más temprana en la que la expresión es verdadera (solo resultados)

WHENLATEST

WHENLATEST: la última hora en la que la expresión es verdadera (solo resultados)

EARLIEST

EARLIEST: el primer valor no nulo de la expresión (solo resultados)

LATEST

LATEST: el último valor no nulo de la expresión (solo resultados)

WHENMAX

WHENMAX: el tiempo en que la expresión alcanza su máximo (solo resultados)

WHENMIN

WHENMIN: el tiempo a que la expresión se encuentra en su mínimo (solo resultados)

Notas adicionales sobre el uso de SQL

  1. El motor SQL no realiza muchas acciones en la comprobación de tipos, por lo que puede realizar varias acciones potencialmente útiles, como:
    1. SET user_number_1 = x > 390000 establecerá user_number_1 como 1 para los elementos con x > 390000, 0 para los demás, ya que las expresiones condicionales se evalúan como 1 para verdadero y 0 para falso.
    2. SET user_text_1 = z - establecerá user_text_1 en el valor z, tenga en cuenta que cuando lo haga, las cadenas tendrán decimales innecesarios y se recortarán los decimales, así podrá tomar estas cadenas y concatenar otras cosas al final si lo desea.
    3. SET user_number_1 = user_text_1 asignará el valor si la cadena es un número válido.
  2. El comportamiento de NULL es un poco complejo.
    1. Esencialmente NULL es un valor "No tengo valor": las vistas de tabla funcionan de la misma forma para los números, ya que existe una diferencia entre colocar 0 en una celda de tabla para un número y dejarlo en blanco. El valor "en blanco" es NULL, es decir, los objetos con celdas en blanco son los que se seleccionan si se realiza la acción x IS NULL.
    2. La regla general para SQL es que cualquier operación que implique cualquier elemento y NULL proporciona la respuesta NULL, por ejemplo
      • 3 + NULL is NULL
      • 3 > NULL is NULL
      • 3 < NULL is NULL

      El motor SQL trata la igualdad de forma algo diferente. x = NULL y x <> NULL hacen lo mismo que X IS NULL y X IS NOT NULL.

  3. Para cadenas, una cadena vacía es NULL y "'' (cadena vacía) simultáneamente. Por ende, tanto asset_id IS NULL, como asset_id = ''" y len(asset_id)=0 seleccionan elementos sin cadena de ID de activo.
  4. Los campos booleanos (campos con casillas de verificación) no tienen ningún concepto de NULL.
  5. Puede ocurrir un error de análisis cuando se haya incluido un nombre de campo que comience por un número. Se recomienda colocar este nombre de campo entre [ ] en la consulta SQL. Por ejemplo, en lugar de escribir SET 2d_pt_id = subcatchment_id, puede utilizar SET [2d_pt_id] = subcatchment_id.