第十章 SQL排序(一)

2021-10-22 05:38:08 字數 4088 閱讀 1535

排序規則指定值的排序和比較方式,並且是intersystems sql和intersystemsiris®資料平台物件的一部分。有兩種基本排序規則:數字和字串。

預設的字串排序規則是sqlupper;為每個命名空間設定此預設值。sqlupper排序規則將所有字母都轉換為大寫(出於排序的目的),並在字串的開頭附加乙個空格字元。此轉換僅用於整理目的;在intersystems中,無論所應用的排序規則如何,sql字串通常以大寫和小寫字母顯示,並且字串的長度不包括附加的空格字元。

時間戳記是乙個字串,因此遵循當前的字串排序規則。但是,由於時間戳是odbc格式,因此如果指定了前導零,則字串排序規則與時間順序相同。

可以使用「objectscript排序後」運算子來確定兩個值的相對排序順序。

可以按以下方式指定排序規則:

排序規則可以在字段/屬性的定義或索引的定義中指定為關鍵字。

可以通過對查詢子句中的欄位名應用排序規則函式來指定排序規則。

在指定排序函式時必須使用%字首。

排序規則採用公升序的ascii/unicode序列,具有以下轉換:

注意:還有多種傳統排序規則型別,不建議使用。

在sql查詢中,可以指定不帶括號%sqlupper name或帶括號%sqlupper(name)的排序規則函式。如果排序規則函式指定了截斷,則必須使用括號%sqlupper(name,10)

三種排序規則型別:sqlstringsqluppertruncate支援可選的maxlen整數值。如果指定,maxlen會將字串的分析截斷為前n個字元。在對長字串進行索引和排序時,可以使用它來提高效能。可以在查詢中使用maxlen進行排序,分組或返回截斷的字串值。

還可以使用%system.util.collation()方法執行排序規則型別轉換。

每個命名空間都有乙個當前的字串排序規則設定。此字串排序規則是為%library.string中的資料型別定義的。預設值為sqlupper。此預設值可以更改。

可以基於每個命名空間定義排序規則預設值。預設情況下,命名空間沒有分配的排序規則,這意味著它們使用sqlupper排序規則。可以為命名空間分配其他預設排序規則。此命名空間預設排序規則適用於所有程序,並且在intersystems上保持不變,iris會重新啟動,直到明確重置為止。

/// d ##class(pha.test.sql).collation()

classmethod collation()

(pha.test.sql)

.collation()

collnew=

"sqlstring"

注意,如果從未設定命名空間排序的預設值,那麼$$getenvironment將返回乙個未定義的排序變數,例如本例中的.collval

這個未定義的排序規則預設為sqlupper

注意:如果資料報含德語文字,大寫排序規則可能不是理想的預設設定。

這是因為德語eszett字元($char(223))只有小寫形式。

相當於大寫的是兩個字母「ss」

轉換為大寫的sql排序規則不會轉換eszett,eszett保持為單個小寫字母不變。

在sql中,排序規則可以分配為字段/屬性定義的一部分。字段使用的資料型別確定其預設排序規則。字串資料型別的預設排序規則為sqlupper。非字串資料型別不支援排序規則分配。

可以在create tablealter table中為字段指定排序規則:

create table sample.mynames (

lastname char(30),

firstname char(30) collate sqlstring)

注意:使用create table``和alter table為字段指定排序規則時,字首是可選的:collate sqlstringcollate %sqlstring

在使用持久類定義定義表時,可以為屬性指定排序規則:

class sample.mynames extends %persistent [ddlallowed]

注意:在為類定義和類方法指定排序規則時,請勿將字首用於排序規則型別名稱。

在這些示例中,lastname字段採用預設排序規則(sqlupper,不區分大小寫),firstname字段使用區分大小寫的sqlstring排序規則進行定義。

如果更改類屬性的排序規則,並且已經儲存了該類的資料,則該屬性上的所有索引都將變為無效。必須基於此屬性重建所有索引。

create index命令無法指定索引排序規則型別。索引使用與要索引的字段相同的排序規則。

定義為類定義一部分的索引可以指定排序規則型別。預設情況下,給定乙個或多個給定屬性的索引使用屬性資料的排序規則型別。例如,假設已定義型別為%string的屬性name

名稱的排序規則為sqlupper%string的預設值)。假設「person」表包含以下資料:

idname

1jones

2johnson

3smith

4jones

5smith

然後,name上的索引將包含以下條目:

name

id(s)

johnson

2jones

1, 4

smith

3, 5

sql引擎可以將此索引直接用於order by或使用「name」字段進行比較操作。

可以通過在索引定義中新增乙個as子句來覆蓋用於索引的預設排序規則:

在這種情況下,nameidx索引現在將以sqlstring(區分大小寫)的形式儲存值。使用上面示例中的資料:

name

id(s)

johnson

2jones

1jones

4smith

5smith

3在這種情況下,對於需要區分大小寫排序規則的任何查詢,sql engine都可以利用此索引。

通常,不必更改索引的排序規則。如果要使用其他排序規則,最好在屬性級別定義它,然後讓屬性上的所有索引都採用正確的排序規則。

如果使用索引屬性執行屬性比較,則在比較中指定的屬性應與相應索引具有相同的排序規則型別。例如,selectwhere子句或joinon子句中的name屬性應與為name屬性定義的索引具有相同的排序規則。如果屬性歸類和索引歸類之間不匹配,則索引可能無效或根本不使用。

如果將索引定義為使用多個屬性,則可以分別指定每個索引的排序規則:

index myidx on (name as sqlstring, code as exact)

;

第十章(4) 希爾排序

include using namespace std 希爾排序 shell sort 又稱 縮小增量排序 他是對插入排序類方法的改進 1.對插入排序的分析得其時間複雜度為o n n 但若待排記錄為 正序 時,其時間複雜度可提高至o n 2.在直接插入排序中,當n值很小的時候效率比較高 所以,希爾排...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...