Referencia de SQL para las expresiones de consulta utilizadas en ArcGIS

Este tema describe los elementos de consultas comunes utilizados en expresiones de selección en ArcGIS. Las expresiones de consulta en ArcGIS utilizan la sintaxis de SQL común.

PrecauciónPrecaución:

La sintaxis de SQL no calcula campos con la Calculadora de campo.

Campos

Para especificar un campo en una expresión SQL, sólo debe proporcionar un delimitador si el nombre de campo resultara ambiguo, como por ejemplo, si tuviese el mismo nombre que una palabra clave reservada de SQL.

Es recomendable que siempre encierre los nombres de campo con un delimitador, puesto que hay muchas palabras clave reservadas y se pueden agregar nuevas palabras clave en versiones posteriores.

Los delimitadores de nombre de campo difieren de un DBMS a otro. Si está consultando datos basados en archivo, como una geodatabase de archivos, datos de geodatabase de ArcSDE, o datos en una clase de entidad o una subcapa de servicio de imágenes de ArcIMS, puede encerrar los nombres de campo con comillas dobles:

"AREA"

Si está consultando datos de geodatabase personal, puede encerrar los campos en corchetes.

[AREA]

Para los datasets ráster de una geodatabase personal, debe encerrar los nombres de campo con comillas dobles:

"AREA"

Cadenas de caracteres

En las consultas, las cadenas de caracteres siempre deben estar encerradas con comillas simples. Por ejemplo:

STATE_NAME = 'California'

Los comodines que utilice para realizar una búsqueda parcial de cadena de caracteres también dependen de la fuente de datos que esté consultando. Por ejemplo, en una fuente de datos basada en archivos o de una geodatabase de ArcSDE, esta expresión seleccionará los estados de Mississippi y Missouri entre los nombres de estados de EE.UU.:

"STATE_NAME" LIKE 'Miss%'

El símbolo de porcentaje (%) significa que se acepta cualquier elemento en su lugar: un carácter, cien caracteres o ningún carácter. Los comodines que utiliza para consultar geodatabases personales son el asterisco (*) para cualquier número de caracteres y el signo de pregunta (?) para un carácter.

Las funciones de cadena de caracteres se pueden utilizar para dar formato a las cadenas de caracteres. Por ejemplo, la función LEFT devolverá una cierta cantidad de caracteres comenzando por la izquierda de la cadena de caracteres. En este ejemplo, la consulta devolverá todos los estados que comiencen con la letra A:

LEFT("STATE_NAME",1) = 'A'

Consulte la documentación del DBMS para obtener una lista de las funciones compatibles.

Números

El punto decimal (.) se utiliza siempre como delimitador decimal, independientemente de la configuración local o regional. La coma no se puede usar como delimitador decimal o de miles en una expresión.

Puede consultar números con los operadores igual (=), no igual (<>), mayor que (>), menor que (<), mayor o igual que (>=), menor o igual que (<=) y BETWEEN. Por ejemplo:

"POPULATION" >= 5000

Se pueden utilizar las funciones numéricas para dar formato a los números. Por ejemplo, la función ROUND redondeará un número a una cantidad de decimales dada en una geodatabase de archivos:

ROUND("SQKM",0) = 500

Consulte la documentación del DBMS para obtener una lista de las funciones numéricas compatibles.

Fechas y hora

Reglas generales

Las fuentes de datos de geodatabase almacenan fechas en un campo de fecha y hora. Sin embargo, las coberturas de ArcInfo y los shapefiles no lo hacen.

Por lo tanto, la mayor parte de la sintaxis de consultas detallada a continuación contiene una referencia a la hora. En algunos casos, la parte de la consulta sobre la hora se puede omitir de manera segura si se sabe que el campo contiene sólo fechas; en otros casos, debe introducirse o la consulta devolverá un error de sintaxis.

El objetivo principal del formato de fecha de ArcMap es almacenar fechas, no horas. Es posible, pero no recomendable, almacenar sólo una hora en el campo cuando la base de datos subyacente en realidad utiliza un campo de fecha y hora. Consultar sobre la hora es algo complicado, por ejemplo, 12:30:05 p.m. se almacenará como "1899-12-30 12:30:05".

NotaNota:

Las fechas se almacenan en la base de datos subyacente como una referencia al 30 de diciembre, 1899, a las 00:00:00. Esto es válido para todas las fuentes de datos detalladas aquí.

El objetivo de esta sección es ayudarlo a consultar sólo sobre valores de fecha, no de hora. Cuando se almacena una hora no nula con las fechas (por ejemplo, 12 de enero, 1999, 04:00:00), consultar sólo sobre la fecha no devolverá el registro porque cuando pasa sólo una fecha a un campo de fecha y hora, completará la hora con ceros y recuperará sólo los registros en los que la hora es 12:00:00 a.m.

La tabla de atributos muestra la fecha y la hora en un formato amigable, según su configuración regional, en lugar del formato de la base de datos subyacente. Esto es positivo la mayoría de las veces pero también tiene algunas desventajas:

  • La cadena de caracteres que se muestra en la consulta SQL puede parecerse sólo un poco al valor mostrado en la tabla, especialmente cuando está involucrada la hora. Por ejemplo, una hora introducida como 00:00:15 se mostrará como 12:00:15 a.m. en la tabla de atributos, con la configuración regional de Estados Unidos, y la sintaxis de consulta comparable será Datefield = "1899-12-30 00:00:15".
  • La tabla de atributos no sabe cuál es la fuente de datos subyacente hasta que se guardan las modificaciones. Primero intentará dar formato al valor introducido para que coincida con su propio formato; después, al guardar las modificaciones, intentará afinar el valor resultante para que se ajuste a la base de datos. Por este motivo, puede introducir una hora en un shapefile, pero comprobará que es descartado cuando guarda los cambios. El campo entonces tendrá un valor "1899-12-30" que se mostrará como 12:00:00 a.m. o algún equivalente dependiendo de su configuración regional.

Sintaxis de fecha y hora para geodatabases de ArcSDE

Informix

Datefield = 'yyyy-mm-dd hh:mm:ss'

No se puede omitir la parte hh:mm:ss de la consulta, incluso si es igual a 00:00:00.

Oracle

Datefield = date 'yyyy-mm-dd'

Tenga en cuenta que no se devolverán registros donde la hora no sea nula.

A continuación se detalla un formato alternativo para consultar fechas en Oracle:

Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')

El segundo parámetro "AAAA-MM-DD HH24:MI:SS" describe el formato utilizado para las consultas. Una consulta real se verá de este modo:

Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')

Puede utilizar una versión más corta:

TO_DATE('2003-11-18','YYYY-MM-DD')

De nuevo, no se devolverán registros donde la hora no sea nula.

SQL Server

Datefield = 'yyyy-mm-dd hh:mm:ss'

La parte hh:mm:ss de la consulta se puede omitir cuando la hora no está establecida en los registros.

El siguiente es un formato alternativo:

Datefield = 'mm/dd/yyyy'

IBM DB2

Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')

No se puede omitir la parte hh:mm:ss de la consulta, incluso si la hora es igual a 00:00:00.

PostgreSQL

Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'YYYY-MM-DD'

Debe especificar la marca de tiempo completa cuando utiliza las consultas "igual a", o no se devolverán registros. Puede hacer consultas satisfactoriamente con las siguientes declaraciones si la tabla que consulta contiene registros de fecha con estas mismas marcas de tiempo (2007-05-29 00:00:00 ó 2007-05-29 12:14:25):

select * from table where date = '2007-05-29 00:00:00';

o bien,

select * from table where date = '2007-05-29 12:14:25';

Si utiliza otros operadores, como "mayor que", "menor que", "mayor o igual que" o "menor o igual que", no tiene que designar la hora aunque puede hacerlo si desea ser preciso. Funcionarán las dos declaraciones siguientes:

select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';

Geodatabases de archivos, shapefiles, coberturas y otras fuentes de datos basadas en archivos

Las fechas de las geodatabases de archivos, los shapefiles y las coberturas están precedidas por date.

"Datefield" = date 'yyyy-mm-dd'

Las geodatabases de archivos admiten el uso de una hora en el campo de fecha, por lo que puede agregarse lo siguiente a la expresión:

"Datefield" = date 'yyyy-mm-dd hh:mm:ss'

Los shapefiles y las coberturas no admiten el uso de la hora en un campo de fecha.

NotaNota:

Todos los SQL utilizados por la geodatabase de archivos están basados en el estándar SQL-92.

Geodatabase personal

Las fechas de las geodatabases personales se delimitan con el signo numeral (#).

Por ejemplo:

[Datefield] = #mm-dd-yyyy hh:mm:ss#

Se puede abreviar a [Datefield] = #mm-dd-yyyy#.

Formato alternativo

[Datefield] = #yyyy/mm/dd#

Limitaciones conocidas

La consulta de una fecha en la parte izquierda (primera tabla) de una unión sólo funciona con las fuentes de datos basadas en archivos, como las geodatabases de archivos, los shapefiles y las tablas DBF. Sin embargo, existe una alternativa para trabajar con datos no basados en archivos, como los datos de geodatabase personal y los datos de ArcSDE, tal como se describe a continuación.

La consulta sobre una fecha en la parte izquierda de una unión será satisfactoria cuando se utilice la versión limitada de SQL desarrollada para las fuentes de datos basadas en archivos. Si no utiliza esa fuente de datos, puede forzar la expresión para que utilice este formato. Esto se puede lograr asegurándose de que la expresión de consulta incluya campos de más de una tabla de unión. Por ejemplo, si una clase de entidad y una tabla (FC1 y Table1) se unen y ambas son de una geodatabase personal, las siguientes expresiones fallarán o no devolverán ningún dato.

FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'

Para realizar una consulta satisfactoriamente, puede crearla de la siguiente manera:

FC1.date = date '01/12/2001' and Table1.OBJECTID > 0

Se utilizará la versión SQL limitada porque la consulta involucra campos de ambas tablas. En esta expresión, Table1.OBJECTID es siempre > 0 para los registros que coincidían durante la creación de la unión, por lo que esta expresión es verdadera para todas las filas que contienen coincidencias de unión.

Para asegurarse de que se seleccionan todos los registros con FC1.date = date "01/12/2001", utilice la siguiente consulta:

FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)

Esta consulta seleccionará todos los registros con FC1.date = date "01/12/2001", independientemente de si hubo una unión coincidente para cada registro en particular.

Subconsultas

NotaNota:

Las coberturas, los shapefiles y otras fuentes de datos basadas en archivos que no sean de tipo geodatabase no admiten subconsultas. Las subconsultas que se realizan en tablas y clases de entidad de ArcSDE versionadas no devolverán entidades almacenadas en las tablas delta. Las geodatabases de archivos proporcionan la compatibilidad limitada para subconsultas explicada en esta sección, mientras que las geodatabases de ArcSDE y personales proporcionan compatibilidad completa. Para obtener más información sobre el conjunto completo de capacidades de subconsultas de las geodatabases de ArcSDE y personales, consulte la documentación DBMS.

Una subconsulta es una consulta anidada en otra consulta. Se puede usar para aplicar funciones predicado o agregar o para comparar datos con los valores almacenados en otra tabla. Esto se puede hacer con la palabra clave IN o ANY. Por ejemplo, esta consulta seleccionará sólo los países que no se encuentran también listados en la tabla indep_countries:

"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)

Esta consulta devolverá las entidades con un GDP2006 mayor que el GDP2005 de cualquiera de las entidades contenidas en los países:

"GDP2006" > (SELECT MAX("GDP2005") FROM countries)

Para cada registro en la tabla, una subconsulta puede requerir analizar todos los datos de la tabla objetivo. Su ejecución puede resultar extremadamente lenta en un dataset grande.

La compatibilidad de las subconsultas en geodatabases de archivos se limita a lo siguiente:

Operadores

A continuación se muestra la lista completa de operadores de consulta admitidos por las geodatabases de archivos, los shapefiles, las coberturas y otras fuentes de datos basadas en archivos. También son admitidos por geodatabases de ArcSDE y personales, aunque estas fuentes de datos pueden requerir una sintaxis diferente. Además de los siguientes operadores, las geodatabases de ArcSDE y personales admiten capacidades adicionales. Consulte la documentación DBMS para obtener más detalles.

Operadores aritméticos

Se utiliza un operador aritmético para sumar, restar, multiplicar y dividir valores numéricos.

Operador

Descripción

*

Operador aritmético para la multiplicación

/

Operador aritmético para la división

+

Operador aritmético para la suma

-

Operador aritmético para la resta

Operadores aritméticos

Operadores de comparación

Se utilizan operadores de comparación para comparar una expresión con otra.

Operador

Descripción

<

Menor que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas.

<=

Menor o igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas.

<>

No igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas.

>

Mayor que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas.

>=

Mayor o igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. Por ejemplo, esta consulta selecciona todas las ciudades con nombres que comienzan con las letras de M a Z:

"CITY_NAME" >= 'M'

[NOT] BETWEEN x AND y

Selecciona un registro si tiene un valor mayor o igual que x y menor o igual que y. Cuando está precedido por NOT, selecciona un registro si tiene un valor fuera del rango especificado. Por ejemplo, esta expresión selecciona todos los registros con un valor mayor o igual que 1 y menor o igual que 10:

"OBJECTID" BETWEEN 1 AND 10
Este es el equivalente de la siguiente expresión:
"OBJECTID" >= 1 AND OBJECTID <= 10
Sin embargo, la expresión con BETWEEN le brindará un mejor rendimiento si está consultando un campo indexado.

[NOT] EXISTS

Devuelve TRUE si la subconsulta devuelve al menos un registro; de lo contrario, devuelve FALSE. Por ejemplo, esta expresión devuelve TRUE si el campo OBJECTID contiene un valor de 50:

EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)
EXISTS se admite sólo en geodatabases de ArcSDE, personales y de archivos.

[NOT] IN

Selecciona un registro si tiene una de varias cadenas o valores en un campo. Cuando está precedido por NOT, selecciona un registro si no tiene una de varias cadenas o valores en un campo. Por ejemplo, esta expresión busca cuatro nombres de estados diferentes:

"STATE_NAME" IN ('Alabama', 'Alaska', 'California', 'Florida')
Este operador también se puede aplicar a una subconsulta en geodatabases de ArcSDE, personales y de archivos:
"STATE_NAME" IN (SELECT "STATE_NAME" FROM states WHERE "POP" > 5000000)

IS [NOT] NULL

Selecciona un registro si tiene un valor nulo para el campo especificado. Cuando NULL está precedido por NOT, selecciona un registro si tiene algún valor para el campo especificado. Por ejemplo, esta expresión selecciona todos los registros con un valor nulo para la población:

"POPULATION" IS NULL

x [NOT] LIKE y [ESCAPE 'carácter de escape']

Utilice el operador LIKE (en lugar del operador =) con comodines para crear una búsqueda de cadena de caracteres parcial. Por ejemplo, esta expresión selecciona Mississippi y Missouri entre los nombres de estados de EE.UU.:

"STATE_NAME" LIKE 'Miss%'
El símbolo de porcentaje (%) significa que se admite cualquier cosa en su lugar: un carácter, cien caracteres o ningún carácter. Alternativamente, si desea buscar con un comodín que represente un carácter, utilice un guión bajo (_). Por ejemplo, esta expresión encuentra Catherine Smith y Katherine Smith:
"OWNER_NAME" LIKE '_atherine Smith'
Los comodines con símbolo de porcentaje y guión bajo funcionan en cualquier tipo de datos basados en archivos o datos de geodatabase multiusuario. LIKE funciona con datos de carácter en ambos lados de la expresión. Si necesita acceder a datos que no son de caracteres, utilice la función CAST. Por ejemplo, esta consulta devuelve números que empiezan con 8 del campo entero SCORE_INT:
CAST ("SCORE_INT" AS VARCHAR) LIKE '8%'
Para incluir el símbolo de porcentaje o el guión bajo en la cadena de búsqueda, utilice la palabra clave ESCAPE para designar otro carácter en lugar del carácter escape, que a su vez indica que inmediatamente sigue un guión bajo o un signo de porcentaje real. Por ejemplo, esta expresión devuelve cualquier cadena que contenga 10%, como 10% DISCOUNT o A10%.
"AMOUNT" LIKE '%10$%%' ESCAPE '$'
El comodín que utiliza para consultar geodatabases personales es un asterisco (*) para cualquier cantidad de caracteres, y un signo de pregunta (?) para un carácter. El signo numeral (#) también se utiliza como un comodín para coincidir con un único dígito (valor numérico). Por ejemplo, esta consulta devuelve los números de parcela A1, A2, etc. de una geodatabase personal:
[PARCEL_NUMBER] LIKE 'A#'

Operadores de comparación

Operadores lógicos

Operador

Descripción

Y

Combina dos condiciones juntas y selecciona un registro si las dos condiciones son verdaderas. Por ejemplo, la siguiente expresión selecciona cualquier casa con más de 1.500 metros cuadrados y un garaje para más de dos autos:

"AREA" > 1500 AND "GARAGE" > 2

O

Combina dos condiciones juntas y selecciona un registro si al menos una condición es verdadera. Por ejemplo, la siguiente expresión selecciona cualquier casa con más de 1.500 metros cuadrados o un garaje para más de dos autos:

"AREA" > 1500 OR "GARAGE" > 2

NOT

Selecciona un registro si no coincide con la expresión. Por ejemplo, la siguiente expresión selecciona todos los estados excepto California:

NOT "STATE_NAME" = 'California'

Operadores lógicos

Funciones

A continuación se muestra la lista completa de funciones admitidas por las geodatabases de archivos, los shapefiles, las coberturas y otras fuentes de datos basadas en archivos. También son admitidos por geodatabases de ArcSDE y personales, aunque estas fuentes de datos pueden requerir una sintaxis o un nombre de función diferente. Además de las siguientes funciones, las geodatabases de ArcSDE y personales admiten capacidades adicionales. Consulte la documentación DBMS para obtener más detalles.

Funciones de fecha

Función

Descripción

CURRENT_DATE

Devuelve la fecha actual.

EXTRACT(extract_field FROM extract_source)

Devuelve la porción extract_field de extract_source. El argumento extract_source es una expresión de fecha y hora. El argumento extract_field puede ser una de las siguientes palabras clave: YEAR, MONTH, DAY, HOUR, MINUTE, o SECOND.

CURRENT TIME

Devuelve la hora actual.

Funciones de fecha

Funciones de cadena

Los argumentos denotados como string_exp pueden ser el nombre de una columna, una cadena de caracteres literal o el resultado de otra función escalar, donde el tipo de datos subyacentes se pueda representar como un tipo de carácter.

Los argumentos denotados como character_exp son cadenas de caracteres de longitud variable.

Los argumentos denotados como start o length pueden ser literal-numérico o el resultado de otra función escalar, donde el tipo de datos subyacentes se pueda representar como un tipo numérico.

Estas funciones de cadena están basadas en 1; es decir, el primer carácter de la cadena es el número 1.

Función

Descripción

CHAR_LENGTH(string_exp)

Devuelve la longitud en caracteres de la expresión de cadena.

CONCAT(string_exp1, string_exp2)

Devuelve una cadena de caracteres que es el resultado de la concatenación de string_exp2 con string_exp1.

LOWER(string_exp)

Devuelve una cadena de caracteres equivalente a la de string_exp, con todos los caracteres en mayúsculas convertidos en minúsculas.

POSITION(character_exp IN character_exp)

Devuelve la posición de la primera expresión de carácter en la segunda expresión de carácter. El resultado es un número exacto con una precisión definida por implementación y una escala de cero.

SUBSTRING(string_exp FROM start FOR length)

Devuelve una cadena de caracteres derivada de string_exp, que comienza en la posición de carácter especificada por los caracteres start para length.

TRIM(BOTH | LEADING | TRAILING trim_character FROM string_exp)

Devuelve string_exp con trim_character quitado del extremo inicial, del extremo final o de ambos extremos de la cadena.

UPPER(string_exp)

Devuelve una cadena equivalente a la de string_exp, con todos los caracteres en minúsculas convertidos en mayúsculas.

Funciones de cadena

Funciones numéricas

Todas las funciones numéricas devuelven un valor numérico.

Los argumentos denotados como numeric_exp, float_exp o integer_exp pueden ser el nombre de una columna, el resultado de otra función escalar o un literal-numérico, donde los tipos de datos subyacentes pueden representarse como un tipo numérico.

Función

Descripción

ABS(numeric_exp)

Devuelve el valor absoluto de numeric_exp.

ACOS(float_exp)

Devuelve el arcoseno de float_exp como un ángulo expresado en radianes.

ASIN(float_exp)

Devuelve el arcoseno de float_exp como un ángulo expresado en radianes.

ATAN(float_exp)

Devuelve el arco tangente de float_exp como un ángulo expresado en radianes.

CEILING(numeric_exp)

Devuelve el entero más pequeño mayor o igual que numeric_exp.

COS(float_exp)

Devuelve el coseno de float_exp, donde float_exp es un ángulo expresado en radianes.

FLOOR(numeric_exp)

Devuelve el entero más grande menor o igual que numeric_exp.

LOG(float_exp)

Devuelve el logaritmo natural de float_exp.

LOG10(float_exp)

Devuelve el logaritmo de base 10 de float_exp.

MOD(integer_exp1, integer_exp2)

Devuelve el restante de integer_exp1 dividido por integer_exp2.

POWER(numeric_exp, integer_exp)

Devuelve el valor de numeric_exp a la potencia de integer_exp.

ROUND(numeric_exp, integer_exp)

Devuelve numeric_exp redondeado a integer_exp lugares a la derecha del punto decimal. Si integer_exp es negativo, numeric_exp se redondea a |integer_exp| lugares a la izquierda del punto decimal.

SIGN(numeric_exp)

Devuelve un indicador del signo de numeric_exp. Si numeric_exp es menor que cero, se devuelve -1. Si numeric_exp es igual a cero; se devuelve 0. Si numeric_exp es mayor que cero; se devuelve 1.

SIN(float_exp)

Devuelve el seno de float_exp, donde float_exp es un ángulo expresado en radianes.

TAN(float_exp)

Devuelve la tangente de float_exp, donde float_exp es un ángulo expresado en radianes.

TRUNCATE(numeric_exp, integer_exp)

Devuelve numeric_exp truncado a integer_exp lugares a la derecha del punto decimal. Si integer_exp es negativo, numeric_exp se trunca a |integer_exp| lugares a la izquierda del punto decimal.

Funciones numéricas

La función CAST

La función CAST convierte un valor a un tipo de datos especificado. La sintaxis es la siguiente:

CAST(exp AS data_type)

El argumento exp puede ser el nombre de una columna, el resultado de otra función escalar o un literal. Data_type puede ser cualquiera de las siguientes palabras clave, que pueden especificarse en mayúsculas o minúsculas. CHAR, VARCHAR, INTEGER, SMALLINT, REAL, DOUBLE, DATE, TIME, DATETIME, NUMERIC, o DECIMAL.

Para obtener más información sobre la función CAST, consulte CAST y CONVERT.

Temas relacionados


7/11/2012