oracle使用关键字做表字段名_ArcGIS SQL使用
本主題將介紹 ArcGIS 中的選擇表達式所用的常規查詢的各個元素。ArcGIS 中的查詢表達式使用常規 SQL 語法。
警告:
SQL 語法不適用于使用字段計算器計算字段。
字段
在 SQL 表達式中指定字段時,如果該字段名可能產生岐義(比如與 SQL 保留關鍵字相同),則需提供一個分隔符。
由于存在許多保留關鍵字,并且后續版本中還能添加新的保留關鍵字,所以建議您始終使用分隔符將字段名稱括起來。
DBMS 和 DBMS 之間的字段名分隔符有所不同。如果要查詢任何基于文件的數據(例如,文件地理數據庫、ArcSDE 地理數據庫數據,或者 ArcIMS 要素類或影像服務子圖層中的數據),可以將字段名稱用雙引號括起:
"AREA"如果要查詢個人地理數據庫數據,可以將字段名稱用方括號括起:
[AREA]對于個人地理數據庫柵格數據集,應將字段名稱用雙引號括起:
"AREA"對于文件地理數據庫數據,您可以將字段名稱用雙引號括起,但是通常不需要。
AREA字符串
查詢中的字符串必須始終用單引號括起。例如:
STATE_NAME = 'California'表達式中的字符串區分大小寫。對于要素類和表,可以用 UPPER 或 LOWER 函數設置所選項的大小寫。例如:
UPPER(STATE_NAME) = 'RHODE ISLAND'個人地理數據庫要素類和表中的字符串不區分大小寫。如果需要,可以使用與 UPPER 或 LOWER 等效的 UCASE 和 LCASE 函數。
如果字符串包含單引號,您首先需要使用另一單引號作為轉義字符。例如:
NAME = 'Alfie''s Trough'
進行部分字符串搜索所用的通配符還取決于所要查詢的數據源。例如,在基于文件的或 ArcSDE 地理數據庫數據源中,以下表達式將從美國州名稱中選擇 Mississippi 和 Missouri:
STATE_NAME LIKE 'Miss%'百分號 (%) 表示這個位置可以是任意字符,即 1 個字符、100 個字符或者無字符均可。在查詢個人地理數據庫時,使用通配符“*”代表任意數量的字符,而使用“?”來代表一個字符。
字符串函數可用來格式化字符串。例如,LEFT 函數將返回字符串左側特定數量的字符。在以下示例中,查詢將返回以字母 A 開頭的所有州:
LEFT(STATE_NAME,1) = 'A'有關支持的函數列表,請參閱 DBMS 文檔。
數值
無論您的區域設置如何,小數點 (.) 將始終用作小數分隔符。在表達式中不能使用逗號作為小數分隔符或千位分隔符。
可以使用等于 (=)、不等于 (<>)、大于 (>)、小于 (=) 和小于等于 (<=) 和 BETWEEN 運算符查詢數值。例如:
POPULATION >= 5000數值函數可用來格式化數值。例如,ROUND 函數可將文件地理數據庫中的數值四舍五入到指定的小數位數:
ROUND(SQKM,0) = 500有關支持的數值函數列表,請參閱 DBMS 文檔。
日期和時間
基本規則
地理數據庫數據源將日期保存在日期時間字段中。但是,ArcInfo coverage 和 shapefile 不是這樣。
因此,下面所列的大部分查詢語法都包含對時間的引用。在某些情況下,當已知字段只包含日期時,查詢中的時間部分可以安全地省略掉;而在其他情況下則需要聲明,否則查詢將返回語法錯誤。
ArcMap 日期格式的主要目的是存儲日期,不是時間。當基礎數據庫實際上使用日期時間字段時,可以在此字段中只存儲時間,但最好不要這樣做。查詢時間會比較麻煩;例如,12:30:05 p.m. 會被存儲為 '1899-12-30 12:30:05'。
注:
基礎數據庫中日期的存儲會參考 1899 年 12 月 30 日 00:00:00。這適用于此處所列出的所有數據源。
本部分內容的目的只是幫助您查詢日期值,而非時間值。當存儲了包含非空時間的日期(例如 1999 年 1 月 12 日 04:00:00)后,只查詢該日期將不會返回這條記錄,因為當向一個日期時間字段只傳遞日期時,系統會自動用零填充時間,所以將只檢索該日期下時間為 12:00:00 a.m 的記錄。
屬性表內會以用戶友好的格式來顯示日期和時間(取決于用戶的區域設置)而不是采用基礎數據庫的格式。這在大多數情況下都很適用,但也有一些缺點:
SQL 查詢中顯示的字符串可能會與表中顯示的值稍有不同,尤其是當包含時間時。例如,輸入的時間 00:00:15 將在屬性表中(當您的區域設置為美國時)顯示為 12:00:15 a.m.,對應于查詢語法將是 Datefield = '1899-12-30 00:00:15'。
屬性表在您保存編輯之前無法知道是何種基礎數據源。它首先會嘗試將輸入的值格式化為符合自己的格式,然后在保存編輯內容時,會再嘗試對生成的值進行調整以便存入數據庫。因此,您可以在 shapefile 中輸入一個時間值,但您會發現當您保存編輯內容時該值會被丟棄。隨后該字段將包含值 '1899-12-30' 并顯示 12:00:00 a.m. 或其他等效的值(取決于您的區域設置)。
ArcSDE 地理數據庫的日期時間語法
Informix
Datefield = 'yyyy-mm-dd hh:mm:ss'查詢的 hh:mm:ss 部分不能省略,即使等于 00:00:00 也是如此。
Oracle
Datefield = date 'yyyy-mm-dd'請切記,這將不會返回時間不為空的記錄。
在 Oracle 中查詢日期的替代格式如下:
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')第二個參數 'YYYY-MM-DD HH24:MI:SS' 用于描述查詢要用的格式。實際的查詢可能類似于:
Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')您可以使用精簡形式:
TO_DATE('2003-11-18','YYYY-MM-DD')同樣,這將不會返回時間不為空的記錄。
SQL Server
Datefield = 'yyyy-mm-dd hh:mm:ss'當記錄中未設置時間時,查詢的 hh:mm:ss 部分可以省略。
替代格式如下:
Datefield = 'mm/dd/yyyy'IBM DB2
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')查詢的 hh:mm:ss 部分不能省略,即使時間等于 00:00:00 也是如此。
PostgreSQL
Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS'Datefield = TIMESTAMP 'YYYY-MM-DD'
使用“等于”查詢時必須指定完整的時間戳,否則將不會返回任何記錄。如果查詢的表中包含這些確切的時間戳(2007-05-29 00:00:00 或 2007-05-29 12:14:25)時,您可以用下列語句成功進行查詢:
select * from table where date = '2007-05-29 00:00:00';或者
select * from table where date = '2007-05-29 12:14:25';如果使用其他運算符(如大于、小于、大于等于或小于等于),您不必指定時間,不過如果您希望更精確些也可以指定。以下兩個語句都可以使用:
select * from table where date < '2007-05-29';select * from table where date < '2007-05-29 12:14:25';文件地理數據庫、shapefile、coverage 和其他基于文件的數據源
文件地理數據庫、shapefile 和 coverage 中的日期前面要加上 date。
"Datefield" = date 'yyyy-mm-dd'文件地理數據庫支持在日期字段中使用時間,因此可將此加入到表達式中:
"Datefield" = date 'yyyy-mm-dd hh:mm:ss'Shapefile 和 coverage 不支持在日期字段中使用時間。
注:
文件地理數據庫所用的所有 SQL 均基于 SQL-92 標準。
個人地理數據庫
個人地理數據庫中的日期使用井號 (#) 來分隔。
例如:
[Datefield] = #mm-dd-yyyy hh:mm:ss#可以將其精簡為 [Datefield] = #mm-dd-yyyy#。
替代格式
[Datefield] = #yyyy/mm/dd#已知局限性
對連接的左側部分(第一張表)的日期查詢只適用于基于文件的數據源,如文件地理數據庫、shapefile 和 DBF 表。不過,對于非基于文件的數據,如個人地理數據庫數據和 ArcSDE 數據也有解決方法,如下文所述。
當使用為基于文件的數據源所開發的受限的 SQL 版本時,對連接的左側部分的日期查詢將獲得成功。如果您沒有使用此類數據源,可以強制表達式使用這種格式。您可以通過確保查詢表達式涉及一個以上連接表的字段來實現此操作。例如,如果一個要素類和一張表(FC1 和 Table1)進行連接且均來自于某一個人地理數據庫,則下列表達式將失敗或不返回任何數據:
FC1.date = date #01/12/2001#FC1.date = date '01/12/2001'
要想查詢成功,您可以創建如下查詢:
FC1.date = date '01/12/2001' and Table1.OBJECTID > 0由于此查詢涉及到兩個表的字段,因此將使用受限的 SQL 版本。在此表達式中,連接創建期間匹配記錄的 Table1.OBJECTID 始終 > 0,因此對于包含連接匹配項的所有行來說此表達式均為 true。
要確保選擇 FC1.date = date '01/12/2001' 的每條記錄,可使用下列查詢:
FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)此查詢將選擇 FC1.date = date '01/12/2001' 的所有記錄,而無論每條記錄是否是連接匹配項。
子查詢
注:
Coverage、shapefile 和其他基于非地理數據庫文件的數據源不支持子查詢。在版本化 ArcSDE 要素類和表上執行的子查詢不會返回增量表中存儲的要素。文件地理數據庫對本部分所述的子查詢提供了有限的支持,而個人地理數據庫和 ArcSDE 地理數據庫則提供完全支持。有關個人地理數據庫和 ArcSDE 地理數據庫中全套子查詢功能方面的詳細信息,請參閱您的 DBMS 文檔。
子查詢是指嵌套在另一個查詢中的查詢。子查詢可用于應用謂詞或聚合函數,或將數據與存儲在另一張表中的值進行比較。可使用 IN 或 ANY 關鍵字來完成。例如,以下查詢只會選擇未列在表 indep_countries 中的國家:
"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)此查詢將返回國家中 GDP2006 大于 GDP2005 的所有要素:
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)對于表中的每條記錄,子查詢可能需要在其目標表中分析所有數據。在大型數據集上執行時可能極其緩慢。
文件地理數據庫僅提供對以下子查詢的支持:
IN 謂詞。例如:
"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)包含比較運算符的標量子查詢。標量子查詢返回單個值。例如:
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)對于文件地理數據庫,集合函數 AVG、COUNT、MIN、MAX 和 SUM 只能用在標量子查詢內。
EXISTS 謂詞。例如:
EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')
運算符
以下是文件地理數據庫、shapefile、coverage 和其他基于文件的數據源所支持的查詢運算符的完整列表。個人地理數據庫和 ArcSDE 地理數據庫也支持這些運算符,但這些數據源可能使用不同的語法。除了以下這些運算符外,個人地理數據庫和 ArcSDE 地理數據庫還支持一些其他功能。有關詳細信息,請參閱 DBMS 文檔。
算術運算符
算術運算符用于對數值進行加、減、乘、除的運算。
* | 乘法算術運算符 |
/ | 除法算術運算符 |
+ | 加法算術運算符 |
- | 減法算術運算符 |
比較運算符
使用比較運算符可以將兩個表達式進行比較。
< | 小于。適用于字符串(基于字母順序進行比較)、數值和日期。 |
<= | 小于或等于。適用于字符串(基于字母順序進行比較)、數值和日期。 |
<> | 不等于。適用于字符串(基于字母順序進行比較)、數值和日期。 |
> | 大于。適用于字符串(基于字母順序進行比較)、數值和日期。 |
>= | 大于或等于。適用于字符串(基于字母順序進行比較)、數值和日期。例如,以下查詢將選擇名稱的開頭字母是 M 到 Z 的所有城市: "CITY_NAME" >= 'M' |
[NOT] BETWEEN x AND y | 選擇值大于等于 x 且小于等于 y 的記錄。當前面有 NOT 時,將選擇值在指定范圍之外的記錄。例如,以下表達式將選擇值大于等于 1 且小于等于 10 的所有記錄: "OBJECTID" BETWEEN 1 AND 10這與以下表達式等效:"OBJECTID" >= 1 AND OBJECTID <= 10但是,在查詢具有索引的字段時使用包含 BETWEEN 的表達式效率會更高。 |
[NOT] EXISTS | 如果子查詢返回至少一條記錄則返回 TRUE;否則返回 FALSE。例如,如果 OBJECTID 字段包含一個值 50,則以下查詢將返回 TRUE: EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)只有文件地理數據庫、個人地理數據庫和 ArcSDE 地理數據庫支持 EXISTS。 |
[NOT] IN | 如果記錄的某個字段包含多個字符串或值的其中一個,那么選擇這條記錄。當表達式前面包含 NOT 時,如果記錄的某個字段不包含多個字符串或值的任何一個,那么將選擇這條記錄。例如,以下表達式將搜索四個不同的州名稱: "STATE_NAME" IN ('Alabama', 'Alaska', 'California', 'Florida')對于文件地理數據庫、個人地理數據庫和 ArcSDE 地理數據庫,此運算符還可用于子查詢:"STATE_NAME" IN (SELECT "STATE_NAME" FROM states WHERE "POP" > 5000000) |
IS [NOT] NULL | 選擇指定字段為空值的記錄。如果 NULL 前面有 NOT,則將選擇指定字段中包含任意值的記錄。例如,以下表達式將選擇 POPULATION 中包含空值的所有記錄: "POPULATION" IS NULL |
x [NOT] LIKE y [ESCAPE '轉義字符'] | 將 LIKE 運算符(不是 = 運算符)與通配符結合使用可以構建對部分字符串的搜索。例如,以下表達式將從美國州名中選擇 Mississippi 和 Missouri: "STATE_NAME" LIKE 'Miss%'百分號 (%) 表示該處可以是任意數量的任何字符:一個字符、一百個字符或無字符。此外,如果您希望在查詢時通配符僅代表一個字符,可使用下劃線 (_)。例如,以下表達式將找到 Catherine Smith 和 Katherine Smith:"OWNER_NAME" LIKE '_atherine Smith'百分號和下劃線通配符適用于任何基于文件的數據或多用戶地理數據庫數據。LIKE 表達式的兩側都要有字符數據。如果需要訪問非字符數據,請使用 CAST 函數。例如,以下查詢將返回整數字段 SCORE_INT 中以 8 開頭的數值:CAST ("SCORE_INT" AS VARCHAR) LIKE '8%'要在搜索字符串中包含百分號或下劃線,請使用 ESCAPE 關鍵字來將另一種字符指定為轉義字符,該字符表示緊接其后的是真正的百分號或下劃線。例如,以下表達式將返回任何包含 10% 的任何字符串,例如 10% DISCOUNT 或 A10%:"AMOUNT" LIKE '%10$%%' ESCAPE '$'在查詢個人地理數據庫時,使用通配符“*”代表任意數量的字符,而使用“?”來代表一個字符。還可以使用井號 (#) 通配符來表示匹配單個數字(數值型值)。例如,以下查詢將從個人地理數據庫返回宗地編號 A1、A2 等等:[PARCEL_NUMBER] LIKE 'A#' |
邏輯運算符
AND | 結合兩個條件,如果兩個條件都為 true 則選擇該記錄。例如,以下表達式將選擇面積大于 1,500 平方英尺且有一個能容納 2 臺以上汽車的車庫的所有房屋: "AREA" > 1500 AND "GARAGE" > 2 |
OR | 結合兩個條件,如果兩個條件中至少有一個為 true 則選擇該記錄。例如,以下表達式將選擇面積大于 1,500 平方英尺或有一個能容納 2 臺以上汽車的車庫的所有房屋: "AREA" > 1500 OR "GARAGE" > 2 |
NOT | 選擇與表達式不匹配的記錄。例如,以下表達式將選擇除 California 之外的所有州: NOT "STATE_NAME" = 'California' |
字符串運算符
| || | 同時返回連接兩個或多個字符串表達式后得到的字符串。 FIRST_NAME || MIDDLE_NAME || LAST_NAME |
函數
以下是文件地理數據庫、shapefile、coverage 和其他基于文件的數據源所支持的函數的完整列表。個人地理數據庫和 ArcSDE 地理數據庫也支持這些函數,但這些數據源可能使用不同的語法或函數名。除了以下這些函數外,個人地理數據庫和 ArcSDE 地理數據庫還支持一些其他功能。有關詳細信息,請參閱 DBMS 文檔。
日期函數
CURRENT_DATE | 返回當前日期。 |
EXTRACT(extract_field FROM extract_source) | 返回 extract_source 的 extract_field 部分。extract_source 參數是一個日期時間表達式。extract_field 參數可以是下列任一關鍵字:YEAR、MONTH、DAY、HOUR、MINUTE 或 SECOND。 |
CURRENT TIME | 返回當前時間。 |
字符串函數
以 string_exp 表示的參數可以是列名、字符串文本或者另一個標量函數的結果,其基礎數據類型可表示為字符型。
以 character_exp 表示的參數是長度可變的字符型字符串。
以 start 或 length 表示的參數可以是數值文本或者另一個標量函數的結果,其基礎數據類型可表示為數值型。
這些字符串函數以 1 為基礎;即字符串的第一個字符為字符 1。
CHAR_LENGTH(string_exp) | 返回字符串表達式的字符長度。 |
LOWER(string_exp) | 返回一個與 string_exp 相等的字符串,其中所有大寫字符均會轉換為小寫字符。 |
POSITION(character_exp IN character_exp) | 返回第一個字符表達式在第二個字符表達式中的位置。結果是一個確切的數值,采用預先定義的精度且小數位數為零。 |
SUBSTRING(string_exp FROM start FOR length) | 返回一個從 string_exp 衍生而來的字符串,其起始字符位置由 start 指定,字符數由 length 指定。 |
TRIM(BOTH | LEADING | TRAILING trim_character FROM string_exp) | 返回字符串的開頭、末尾或兩端移除 trim_character 后所得的 string_exp。 |
UPPER(string_exp) | 返回一個與 string_exp 相等的字符串,其中所有小寫字符均會轉換為大寫字符。 |
數值函數
所有數值函數均返回數值型值。
以 numeric_exp、float_exp 或 integer_exp 表示的參數可以是列名、另一個標量函數的結果或數值文本,其基礎數據類型可表示為數值型。
ABS(numeric_exp) | 返回 numeric_exp 的絕對值。 |
ACOS(float_exp) | 返回作為角度的 float_exp 的反余弦值,用弧度表示。 |
ASIN(float_exp) | 返回作為角度的 float_exp 的反正弦值,用弧度表示。 |
ATAN(float_exp) | 返回作為角度的 float_exp 的反正切值,用弧度表示。 |
CEILING(numeric_exp) | 返回大于或等于 numeric_exp 的最小整數。 |
COS(float_exp) | 返回 float_exp 的余弦值,其中 float_exp 是以弧度表示的角度。 |
FLOOR(numeric_exp) | 返回小于或等于 numeric_exp 的最大整數。 |
LOG(float_exp) | 返回 float_exp 的自然對數。 |
LOG10(float_exp) | 返回 float_exp 的以 10 為底的對數。 |
MOD(integer_exp1, integer_exp2) | 返回 integer_exp1 除以 integer_exp2 所得的余數。 |
POWER(numeric_exp, integer_exp) | 返回 numeric_exp 的 integer_exp 次冪的值。 |
ROUND(numeric_exp, integer_exp) | 返回四舍五入至小數點右側第 integer_exp 位的 numeric_exp。如果 integer_exp 為負數,則 numeric_exp 將被四舍五入至小數點左側第 |integer_exp| 位。 |
SIGN(numeric_exp) | 返回 numeric_exp 正負號的標志。如果 numeric_exp 小于零,則返回 -1。如果 numeric_exp 等于零,則返回 0。如果 numeric_exp 大于零,則返回 1。 |
SIN(float_exp) | 返回 float_exp 的正弦值,其中 float_exp 是以弧度表示的角度。 |
TAN(float_exp) | 返回 float_exp 的正切值,其中 float_exp 是以弧度表示的角度。 |
TRUNCATE(numeric_exp, integer_exp) | 返回截斷至小數點右側第 integer_exp 位的 numeric_exp。如果 integer_exp 為負數,則 numeric_exp 將被截斷至小數點左側第 |integer_exp| 位。 |
CAST 函數
CAST 函數可將值轉換為指定的數據類型。語法如下:
CAST(exp AS data_type)
exp 參數可以是列名、另一個標量函數的結果或是一個文本。Data_type 可以是下列任意關鍵字,可以用大寫或小寫形式指定:CHAR、VARCHAR、INTEGER、SMALLINT、REAL、DOUBLE、DATE、TIME、DATETIME、NUMERIC 或 DECIMAL。
有關 CAST 函數的詳細信息,請參閱 CAST 和 CONVERT。?
總結
以上是生活随笔為你收集整理的oracle使用关键字做表字段名_ArcGIS SQL使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 常用函数 - Pytho
- 下一篇: cx_Oracle怎么打包,cx_Ora