- Foxtable數(shù)據(jù)庫應(yīng)用開發(fā)寶典
- 賀輝 周菁
- 4885字
- 2020-09-07 00:13:27
1.4 數(shù)據(jù)列與表達(dá)式列
1.4.1 數(shù)據(jù)列
之前在創(chuàng)建或修改數(shù)據(jù)表結(jié)構(gòu)時(shí),用到的都是普通數(shù)據(jù)列,這些列都可直接輸入數(shù)據(jù),所輸入的全部內(nèi)容也都將物理保存在項(xiàng)目文件中。
1.4.2 表達(dá)式列
所謂的表達(dá)式列,其內(nèi)容是由一個(gè)表達(dá)式計(jì)算得出的。這些內(nèi)容并不會進(jìn)行物理保存,僅在運(yùn)行時(shí)動態(tài)生成。這和Excel中的公式計(jì)算是一樣的道理。
以Excel的訂單表為例,假如希望通過單價(jià)、折扣和數(shù)量得到金額的值,可以先在G2單元格設(shè)置計(jì)算公式,然后按住G2單元格右下角的加號(填充柄)向下拖曳即可得到結(jié)果(或者雙擊填充柄),如下圖所示。

拖曳或雙擊后得到的金額數(shù)值如下圖所示。

此時(shí),如果單擊金額列的任意一個(gè)單元格,其上方的編輯欄顯示的都是計(jì)算公式而不是具體的值,這就表明該列數(shù)據(jù)并不是物理存在的,而是根據(jù)其他列的內(nèi)容動態(tài)生成的。
Foxtable的表達(dá)式列也是同樣的道理。
例如,在訂單表中增加一個(gè)表達(dá)式列:單擊【數(shù)據(jù)表】功能區(qū)的【表相關(guān)】功能組中的【其他】命令按鈕,選擇下拉菜單中的【查看表結(jié)構(gòu)】命令,或者直接單擊【數(shù)據(jù)表】功能區(qū)的【列相關(guān)】功能組中的【增加列】按鈕,選擇下拉菜單中的【表達(dá)式列】命令,如下圖所示。

彈出對話框如下圖所示,先設(shè)置列名和數(shù)據(jù)類型。

然后單擊“表達(dá)式”輸入框右側(cè)的【…】按鈕,打開【表達(dá)式生成器】對話框,如下圖所示。

其中,表達(dá)式編輯框下方的一排按鈕為常用運(yùn)算符,單擊即可添加到編輯框中;下方左側(cè)列表框列出的為常用函數(shù),中間列表框列出的為當(dāng)前數(shù)據(jù)表已經(jīng)存在的數(shù)據(jù)列,雙擊均可添加到編輯框中;下方右側(cè)列表框列出的為在線幫助,雙擊相應(yīng)選項(xiàng)可查看具體的幫助內(nèi)容。
需注意,字段名稱列表中的“_Identify”和“_Locked”是隱藏列,其作用在之前的“創(chuàng)建數(shù)據(jù)表結(jié)構(gòu)”一節(jié)中有過詳細(xì)講解。
表達(dá)式編輯完成后,單擊【確定】按鈕,將生成一個(gè)表達(dá)式列,如下圖所示。

上圖中,“金額”列的值就是根據(jù)其他列的值動態(tài)生成的。只要相關(guān)列的數(shù)據(jù)發(fā)生變化,該列數(shù)據(jù)也會自動即時(shí)更新。當(dāng)需要修改表達(dá)式列的列名、標(biāo)題或數(shù)據(jù)類型時(shí),可以單擊菜單上的【更改列】命令按鈕;當(dāng)需要修改表達(dá)式時(shí),可單擊【fx表達(dá)式】命令按鈕。
注意:當(dāng)表達(dá)式列沒有設(shè)置計(jì)算公式時(shí),雖然可以輸入數(shù)據(jù),但這些數(shù)據(jù)并不會被保存;已經(jīng)設(shè)置了計(jì)算公式的表達(dá)式列,雖然手工可以修改列中的數(shù)據(jù),但按“Tab”鍵或“Enter”鍵確認(rèn)時(shí)仍然會自動還原為公式計(jì)算。
表達(dá)式不僅可以用于生成表達(dá)式列,還可用于條件設(shè)置等其他場合。例如,復(fù)制“訂單”表時(shí),可同時(shí)設(shè)置要復(fù)制的數(shù)據(jù)條件,如下圖所示。

需注意,這里設(shè)置的條件只能使用數(shù)據(jù)列,不能使用表達(dá)式列。如上圖所示,假如將條件改為:
[金額] > 500
單擊【確定】按鈕將不會有任何結(jié)果,這是因?yàn)椤敖痤~”列是表達(dá)式列!而且,在復(fù)制完成的數(shù)據(jù)表中表達(dá)式列不會被復(fù)制。
1.4.3 表達(dá)式編寫規(guī)則
表達(dá)式由運(yùn)算符、列名稱及函數(shù)組成。首先說明一點(diǎn),這些都是不區(qū)分大小寫的。例如,運(yùn)算符“In”可寫成“in”,列名“產(chǎn)品ID”可寫成“產(chǎn)品id”,函數(shù)“Len”可寫成“l(fā)en”等。
?運(yùn)算符
如同前面的“表達(dá)式生成器”對話框所示,常用的運(yùn)算符有20個(gè),實(shí)際數(shù)量比20個(gè)還要多。具體可分為以下幾類。
● 算術(shù)運(yùn)算符
此類運(yùn)算符共有5個(gè),分別為+(加)、-(減)、*(乘)、/(除)、%(取余數(shù))。
其中,前4個(gè)都很好理解,第5個(gè)表示取余數(shù):當(dāng)使用%計(jì)算的結(jié)果為0時(shí),表明前一個(gè)數(shù)可以被后一個(gè)數(shù)整除。例如,5 % 2的結(jié)果為1,表示5除以2的余數(shù)是1。
需要注意的是,使用%時(shí),前后兩個(gè)數(shù)字必須是整數(shù),如51%2就會提示錯誤。
再如,將訂單表中的“金額”列表達(dá)式改為:
[折扣] % [單價(jià)]
同樣也會出錯。這是因?yàn)檎劭酆蛦蝺r(jià)列并不完全是整數(shù)。
● 比較運(yùn)算符
此類運(yùn)算符共有8個(gè),一般需要配合表達(dá)式函數(shù)來使用。具體包括=(等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、<>(不等于)、In(包含)、Like(匹配)。
其中,前6個(gè)運(yùn)算符同樣很好理解,例如:
[數(shù)量] < 100
現(xiàn)重點(diǎn)學(xué)習(xí)后面兩個(gè)運(yùn)算符。
○ In:用來判斷某一個(gè)值是否為指定的多個(gè)值中的任何一個(gè)
例如,以下3個(gè)表達(dá)式就分別使用了字符、數(shù)值和日期3種數(shù)據(jù)類型進(jìn)行判斷,以表示指定列的值是否在所列舉的范圍之中:
[產(chǎn)品ID] In ('P01','P02','P03')
[數(shù)量] In (170,500,820)
[日期] In ('7/2/2012', #7/12/2012#, #2012-8-10#)
很顯然,當(dāng)使用In時(shí),如果指定值為字符,要用單引號括起來;如果為日期,可用單引號或#號,日期值可以是“年-月-日”,也可以是“月/日/年”;其他類型數(shù)值可直接寫。當(dāng)判斷的內(nèi)容中有英文字母時(shí),是不區(qū)分大小寫的。例如,上面的第一行代碼,當(dāng)“產(chǎn)品ID”為p01、p02或p03時(shí),也是符合判斷條件的。
當(dāng)指定的字符本身就帶有單引號時(shí),編寫表達(dá)式時(shí)要用兩個(gè)單引號代替。例如,以下代碼表示判斷標(biāo)題名稱是否為“你在用foxtable嗎”:
[標(biāo)題名稱] In ('你在用''foxtable''嗎')
由于這里只有一個(gè)判斷值,因此也可以寫成:
[標(biāo)題名稱] =‘你在用''foxtable''嗎'
如果在In運(yùn)算符之前加上Not關(guān)鍵詞,表示不在指定的數(shù)值中。例如:
[產(chǎn)品ID] Not In ('p01','p02','p03')
○ Like:使用“*”或“%”通配符比較字符串
在這種比較中,“*”和“%”是可以互換的,表示任意個(gè)數(shù)的字符,且只能用在開頭或者結(jié)尾。例如,判斷以“P”開頭的“產(chǎn)品ID”:
[產(chǎn)品ID] Like 'P%'
再如,判斷是否以單引號結(jié)尾:
[產(chǎn)品ID] Like '*'''
需注意,在字符串的中間是不允許使用通配符的。如果要將通配符作為比較內(nèi)容的一部分,必須使用中括號括起來,這樣就會將“*”和“%”還原為普通的字符。例如,判斷“產(chǎn)品ID”是否以“A*”開頭:
[產(chǎn)品ID] Like 'A[*]%'
和In一樣,Like運(yùn)算符的前面也可以加上Not關(guān)鍵詞,表示不類似的意思。例如:
[產(chǎn)品ID] Not Like '*A*'
● 連接運(yùn)算符
在之前所舉的表達(dá)式示例中,已經(jīng)多次用到這種連接運(yùn)算符。例如,[]用于連接列名稱或者將“*”“%”還原為普通字符,單引號“‘”用于連接字符串,“#”用于連接日期。此外,還有以下幾種常用的連接運(yùn)算符。
():用于組合表達(dá)式或者強(qiáng)制改變優(yōu)先級。例如,之前用于計(jì)算金額列的表達(dá)式為:
[數(shù)量] * [單價(jià)] * (1 - [折扣])
And:前后連接的表達(dá)式必須同時(shí)滿足。例如,“產(chǎn)品ID”以P開頭、同時(shí)數(shù)量小于500:
[產(chǎn)品ID] Like 'P%' And [數(shù)量] < 500
Or:前后連接的表達(dá)式只需滿足一個(gè)即可。例如,“產(chǎn)品ID”以P開頭或者數(shù)量小于500:
[產(chǎn)品ID] Like 'P%' Or [數(shù)量] < 500
計(jì)算表達(dá)式值時(shí)And優(yōu)先于Or,可使用括號來強(qiáng)制改變這種優(yōu)先級。例如:
([產(chǎn)品ID] ='P01' Or [產(chǎn)品ID] ='P02') And [數(shù)量] < 500
?列名稱
當(dāng)在表達(dá)式中需要用到列名時(shí),列名稱最好用方括號括起來,盡管這并不是必需的。
但是,當(dāng)列名稱中含有一些特殊字符時(shí),列名則必須用中括號括起來。關(guān)于這一點(diǎn)將在第3章中再作詳細(xì)說明。
?表達(dá)式函數(shù)
在“表達(dá)式生成器”對話框中,下方左側(cè)的列表框就是一些常用的表達(dá)式函數(shù)。具體可分為以下幾種。
● 聚合函數(shù)
此類函數(shù)一般用于數(shù)據(jù)統(tǒng)計(jì),共有7個(gè),即Sum(求和)、Avg(平均)、Min(最小值)、Max(最大值)、Count(計(jì)數(shù))、Var(方差)、St Dev(標(biāo)準(zhǔn)偏差)。
其中,最后兩個(gè)函數(shù)是用于測量數(shù)值型數(shù)據(jù)離散程度的重要指標(biāo),一般用于專業(yè)性較強(qiáng)的數(shù)理統(tǒng)計(jì),日常工作中很少用到,基本可以忽略。
需要說明的是,表達(dá)式中的聚合函數(shù)很少在單獨(dú)的數(shù)據(jù)表中使用,它一般用于關(guān)聯(lián)表的統(tǒng)計(jì)。關(guān)于這方面的知識將在“表間關(guān)聯(lián)”一節(jié)中學(xué)習(xí)。
● IIF函數(shù)
該函數(shù)使用頻率很高,如果表達(dá)式的計(jì)算結(jié)果為True,則返回一個(gè)指定值;否則將返回另一個(gè)指定值。例如,將“金額”列的表達(dá)式修改為:
IIF([單價(jià)] = 0, Null ,[單價(jià)] * (1 - [折扣]) * [數(shù)量])
該表達(dá)式的意思是,如果“折扣”列的值為0,那么“金額”就設(shè)置為Null;否則就以單價(jià)、折扣、數(shù)量三列的乘積生成“金額”值。
在列表達(dá)式中,Null用于表示空值,也就是什么都沒有。
● Is Null函數(shù)
該函數(shù)用于判定一個(gè)指定表達(dá)式的值是否為空值。如果不為空,則返回表達(dá)式的值;否則返回一個(gè)替代值。例如,將下圖所示的第3行和第5行“折扣”為0的值按“Delete”鍵刪除,它們就變成了空值。

然后將"金額"列的表達(dá)式修改為:
[單價(jià)] * (1 - [折扣]) * [數(shù)量]。
執(zhí)行后發(fā)現(xiàn),第3行和第5行“金額”列的值仍然是空。此種情況表明,只要表達(dá)式中存在空值,那么它的計(jì)算結(jié)果肯定也為空。如果希望將空值列正常參與運(yùn)算,有以下兩種處理方法。
第一種,使用IIF函數(shù):
[單價(jià)] * (1 - IIF([折扣] Is Null, 0,[折扣])) * [數(shù)量]
該表達(dá)式的重點(diǎn)在于加粗的部分:如果“折扣”為空值,就以0替代;否則仍然取原來的折扣值。如果判斷不為空,可使用Is Not Null。
第二種,使用Is Null函數(shù):
[單價(jià)] * (1 - Is Null([折扣],0)) * [數(shù)量]
這里Is Null函數(shù)的意思是:如果“折扣”為空,那么就以0替代;否則仍然用原來的折扣值。
很顯然,使用Is Null語句返回的是一個(gè)邏輯值;而使用Is Null函數(shù)則直接返回具體的數(shù)值。雖然僅有一個(gè)空格之差,但意義卻完全不同!
以上兩種方式的處理結(jié)果都是一樣的,如下圖所示。

● 字符處理函數(shù)
這方面的表達(dá)式函數(shù)有3個(gè),即Trim(移除字符串的前后空格)、Substring(從字符串中的指定位置開始返回指定長度的子字符串)、Len(返回字符串的長度)。
例如,再增加一個(gè)臨時(shí)的字符型表達(dá)式列,如下圖所示。

這里表達(dá)式的意思是,取“產(chǎn)品ID”列和“客戶ID”列的前兩個(gè)字符并進(jìn)行拼接(Substring的起始位置是從1開始的)。生成的表達(dá)式列效果如下圖所示。

● Convert轉(zhuǎn)換函數(shù)
該函數(shù)可以將表達(dá)式轉(zhuǎn)換為指定的數(shù)據(jù)類型。其語法格式為:
Convert(expression,type)
其中,參數(shù)expression為要轉(zhuǎn)換的表達(dá)式;type為轉(zhuǎn)換成的數(shù)據(jù)類型。可轉(zhuǎn)換的數(shù)據(jù)類型包括以下幾種。
System String:字符型
System Date Time:日期時(shí)間型
System Boolean:邏輯型
System Byte:微整數(shù)
System Int16:短整數(shù)
System Int32:整數(shù)
System Int64:長整數(shù)
System Single:單精度小數(shù)
System Double:雙精度小數(shù)
System Decimal:高精度小數(shù)
其中,只有“System Int64”和Foxtable數(shù)據(jù)表中的列類型不存在對應(yīng)關(guān)系。該類型表示長整數(shù),其值介于-9 223 372 036 854 775 808~+9 223 372 036 854 775 807之間。在Foxtable數(shù)據(jù)表中,此范圍的整數(shù)一般是用雙精度小數(shù)代替。
Convert函數(shù)除了可以轉(zhuǎn)換數(shù)據(jù)類型外,還可變相實(shí)現(xiàn)一些其他功能。例如,列表達(dá)式并沒有提供專門的四舍五入函數(shù),只能用Convert函數(shù)來間接實(shí)現(xiàn)。假如將金額列保留兩位小數(shù),表達(dá)式可修改為:
Convert([單價(jià)] * (1 - Is Null([折扣],0)) * [數(shù)量] * 100, 'System.Int64')/100
該表達(dá)式的意思是,先將得到的計(jì)算結(jié)果乘以100,再轉(zhuǎn)換為長整數(shù);然后再以這個(gè)長整數(shù)除以100,得到的數(shù)據(jù)肯定最多只有兩位小數(shù)。同理,如果要保留3位小數(shù),將表達(dá)式中的100改為1000即可,其余類推。
再比如,利用數(shù)據(jù)表中隱藏的自動編號列“_Identify”,可以生成指定格式的編號列。假如希望編號列能夠按照下面的格式顯示:
MP0001
MP0002
┇
MP0011
MP0012
┇
MP0123
MP0124
┇
MP9998
MP9999
這種編碼的規(guī)則是:前面是兩個(gè)字母“MP”,后接4個(gè)數(shù)字,當(dāng)數(shù)字的長度沒有達(dá)到4位時(shí)要自動補(bǔ)充0。實(shí)現(xiàn)此目的的重點(diǎn)在于如何根據(jù)“_Identify”的值來確定補(bǔ)充多少個(gè)0:當(dāng)“_Identify”的值是一位數(shù)時(shí),要加3個(gè)0;是兩位數(shù)時(shí),加2個(gè)0;是3位數(shù)時(shí)加1個(gè)0。由此可見,需要補(bǔ)充的0的數(shù)量為:用4減去“_Identify”值的長度。用代碼表示為:
4 - Len(Convert([_Identify],’System.String’))。
把這個(gè)長度用到Substring函數(shù)中,就表示要從字符串“0000”中截取的長度,也就是需補(bǔ)充多少個(gè)0:
Substring(‘0000’, 1, 4 - Len(Convert([_Identify],’System.String’)))
然后再在其前面加上字符串“MP”、在尾部加上“_Identify”列的值即可:
'MP'+ Substring('0000', 1, 4 - Len(Convert([_Identify],'System.String'))) + Convert([_Identify], 'System.String')
運(yùn)行效果如下圖所示。

如果要將編碼的數(shù)字固定為6位,可將上述表達(dá)式中的“0000”改為“000000”,將4改為6。因而這種自動編號的表達(dá)式是可以通用的。
需要注意的是,當(dāng)在列表達(dá)式中使用Convert函數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換時(shí),日期型的數(shù)據(jù)只能與字符串進(jìn)行轉(zhuǎn)換,邏輯型數(shù)據(jù)只能與字符串及整數(shù)類型(Byte、Int16、Int32、Int64)進(jìn)行轉(zhuǎn)換。
1.4.4 表達(dá)式列和數(shù)據(jù)列的相互轉(zhuǎn)換
單擊【數(shù)據(jù)表】功能區(qū)的【列相關(guān)】功能組中的【其他】按鈕,將彈出表達(dá)式列與數(shù)據(jù)列相互轉(zhuǎn)換的下拉菜單,如下圖所示。

? 當(dāng)數(shù)據(jù)列轉(zhuǎn)換為表達(dá)式列時(shí),該數(shù)據(jù)列中的原有內(nèi)容將全部消失,因?yàn)楸磉_(dá)式列只能通過設(shè)置的表達(dá)式來動態(tài)生成數(shù)據(jù)。
? 同理,當(dāng)表達(dá)式列轉(zhuǎn)換為數(shù)據(jù)列時(shí),由于該列的表達(dá)式已經(jīng)被刪除,因此數(shù)據(jù)一樣會消失。既然已經(jīng)轉(zhuǎn)換為數(shù)據(jù)列,就只能自行編輯輸入數(shù)據(jù)。
不論是數(shù)據(jù)列轉(zhuǎn)換為表達(dá)式列,還是表達(dá)式列轉(zhuǎn)換為數(shù)據(jù)列,一旦確定轉(zhuǎn)換,F(xiàn)oxtable都會自動重新打開當(dāng)前項(xiàng)目。
- 同步:秩序如何從混沌中涌現(xiàn)
- Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)
- SQL入門經(jīng)典(第5版)
- Hands-On Machine Learning with Microsoft Excel 2019
- 信息系統(tǒng)與數(shù)據(jù)科學(xué)
- 正則表達(dá)式必知必會
- 企業(yè)大數(shù)據(jù)系統(tǒng)構(gòu)建實(shí)戰(zhàn):技術(shù)、架構(gòu)、實(shí)施與應(yīng)用
- Oracle RAC 11g實(shí)戰(zhàn)指南
- 云計(jì)算服務(wù)保障體系
- Learn Unity ML-Agents:Fundamentals of Unity Machine Learning
- 重復(fù)數(shù)據(jù)刪除技術(shù):面向大數(shù)據(jù)管理的縮減技術(shù)
- 大數(shù)據(jù)治理與安全:從理論到開源實(shí)踐
- INSTANT Android Fragmentation Management How-to
- 實(shí)現(xiàn)領(lǐng)域驅(qū)動設(shè)計(jì)
- 數(shù)據(jù)分析思維:產(chǎn)品經(jīng)理的成長筆記