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.
Campos
Para especificar un campo en una expresión SQL, proporcione 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"
Para los datos de geodatabases de archivos puede encerrar los nombres de campo entre comillas dobles, pero generalmente no es necesario.
AREA
Cadenas de caracteres
En las consultas, las cadenas de caracteres siempre deben estar encerradas con comillas simples. Por ejemplo:
STATE_NAME = 'California'
- En las expresiones, las cadenas de caracteres distinguen entre mayúsculas y minúsculas. Para las tablas y clases de entidad, puede utilizar la función UPPER o LOWER para establecer las mayúsculas y minúsculas de una selección. Por ejemplo:
UPPER(STATE_NAME) = 'RHODE ISLAND'
- Las cadenas de caracteres no distinguen entre mayúsculas y minúsculas en el caso de las tablas y clases de entidad de geodatabase personal. Si es necesario, puede utilizar las funciones UCASE y LCASE que equivalen a UPPER o LOWER.
- Si la cadena de caracteres contiene una comilla simple, tendrá que usar otra comilla simple como carácter de escape. Por ejemplo:
NAME = 'Alfie''s Trough'
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á 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 solo 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 solo 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".
El objetivo de esta sección es ayudarlo a consultar solo 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 solo sobre la fecha no devolverá el registro porque cuando pasa solo una fecha a un campo de fecha y hora, completará la hora con ceros y recuperará solo 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 solo 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.
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 solo 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
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á solo 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:
- Predicado IN. Por ejemplo:
"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)
- Subconsultas escalares con operadores de comparación. Una subconsulta escalar devuelve un solo valor. Por ejemplo:
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)
Para las geodatabases de archivos, las funciones establecidas AVG, COUNT, MIN, MAX, y SUM solo pueden utilizarse con subconsultas escalares. - Predicado EXISTS. Por ejemplo:
EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')
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 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 10Este es el equivalente de la siguiente expresión: "OBJECTID" >= 1 AND OBJECTID <= 10Sin 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 solo 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 acepta cualquier elemento 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 '$'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. 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 lógicos
Operador | Descripción |
---|---|
AND | 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 |
OR | 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 de cadena de caracteres
Operador | Descripción |
---|---|
|| | Devuelve una cadena de caracteres que es el resultado de concatenar dos o más expresiones de cadena. FIRST_NAME || MIDDLE_NAME || LAST_NAME |
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_fieldFROM 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 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. |
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 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 arcocoseno 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. |
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 se pueden especificar 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.