查詢?nèi)?/h1>
查詢功能由三個要素組成:查詢字段烟央、查詢關(guān)鍵字、查詢方式
一般的查詢側(cè)重前兩項歪脏,比如按照手機號查詢疑俭、按照訂單號查詢等等。
但是查詢方式呢婿失?往往都是只設(shè)置了一種钞艇,比如查詢手機號,只能是模糊查詢豪硅,包含要查的數(shù)字就算哩照,不會做更詳細(xì)的區(qū)分。
比如我想查138 開頭的手機號懒浮,那么中間可以能出現(xiàn)138 飘弧,我想查0318結(jié)尾的手機號,那么0318也可能出現(xiàn)在中間砚著。
一般的情況下次伶,如果客戶不是特意強調(diào)需求的話,一個字段只會給出一個查詢方式稽穆,不會提供其他備選的查詢方式冠王。
這個,是不是不夠靈活秧骑?
所以我想做一個更靈活的查詢控件版确,首先就要實現(xiàn)多種查詢方式。
那么有多少種查詢方式呢乎折?簡單的整理了一下
/**
* 查詢方式
* * 數(shù)字 =绒疗、<>、>=骂澄、<=吓蘑、between
* * 字符串 =、不等于、包含磨镶、起始于溃蔫、結(jié)束于
* * 日期時間 =、between
*/
export const findKindList = {
// 字符串
401: { // 等于 字符
id: 401,
name: '=',
where: '{col} = "{key}"'
},
402: { // 不等于 字符
id: 402,
name: '不等',
where: '{col} <> "{key}"'
},
403: { // 包含 字符
id: 403,
name: '包含',
where: '{col} like "%{key}%"'
},
404: { // 不包含 字符
id: 404,
name: '不包含',
where: '{col} not like "%{key}%"'
},
405: { // 起始于 字符
id: 405,
name: '起始于',
where: '{col} like "{key}%"'
},
406: { // 結(jié)束于 字符
id: 406,
name: '結(jié)束于',
where: '{col} like "%{key}"'
},
// 數(shù)字
411: { // 等于 數(shù)字
id: 411,
name: '等于',
where: '{col} = {key}'
},
412: { // 不等于 數(shù)字
id: 412,
name: '不等于',
where: '{col} <> {key}'
},
413: { // 大于 數(shù)字
id: 413,
name: '>',
where: '{col} > {key}'
},
414: { // 大于等于 數(shù)字
id: 414,
name: '>=',
where: '{col} >= {key}'
},
415: { // 小于 數(shù)字
id: 415,
name: '<',
where: '{col} < {key}'
},
416: { // 小于等于 數(shù)字
id: 416,
name: '<=',
where: '{col} <= {key}'
},
417: { // 范圍 數(shù)字
id: 417,
name: '從',
where: '{col} between {key1} and {key2}'
},
// 多選組
420: {
id: 420,
name: 'in',
where: '{col} in ({key})'
}
}
基本是這些琳猫,然后就是日期的查詢方式伟叛,這個比較亂。
以前只是“等于日期”脐嫂,日期范圍就可以了统刮,但是現(xiàn)在日期控件不僅可以提供日期,還可以提供“年月”账千、“年”侥蒙、“年周”這類的形式。
而且后端也出現(xiàn)了用int或者char的類型來存放日期數(shù)據(jù)匀奏。
那么綜合起來要如何做查詢呢鞭衩?
似乎排列組合的結(jié)果有點多。
等于
日期娃善、日期+時間论衍、年月、年周
范圍
開始日期 + 結(jié)束日期会放、年月(比如202101)饲齐、年周(比如202104)、年(比如2021)
開始年月+結(jié)束年月咧最、開始年周+結(jié)束年周捂人、開始年份 + 結(jié)束年份
大于小于的情況。
其中年月矢沿,就是指的某一個月份滥搭,比如202101,指的是2021年01月01日到 2021年01月31日
有的時候只是查一個月的范圍捣鲸,那么也就沒必要選擇開始日期+結(jié)束日期的形式瑟匆,或者開始年月+結(jié)束年月這么麻煩。
所以日期的查詢還是很麻煩的栽惶,目前是想用兩個角度的分類愁溜。
首先按照查詢條件來分:等于、范圍外厂、大于冕象、小于
然后按照日期類型來分:日期、日期+時間汁蝶、年月渐扮、年周论悴、年
這樣避免羅列組合的數(shù)量。另外還有一個顯示格式和交給后端的格式的問題墓律。這就要看后端期待什么格式了膀估,是字符串的‘2021-01-01’的形式,還是標(biāo)識的日期格式耻讽,或者是時間戳察纯。
總是很麻煩,那么為啥要考慮這么多呢齐饮?因為就是這些事情捐寥,前端不愛管笤昨,后端也不愛管祖驱,那么誰來管?只能是做控件的來操心了呀瞒窒,要不然豈不是封裝了個寂寞捺僻。。崇裁。
所以還是需要一些時間來完善的匕坯。
目前是這樣的,比較簡陋
數(shù)據(jù)格式
如果只是字段和查詢關(guān)鍵字的話拔稳,可以用key-value的對象形式葛峻,但是現(xiàn)在多了一個查詢條件,那么要如何設(shè)計呢巴比?
- 方案一:
{
colName: 'title',
findKind: 401,
findValue: '某某某'
},
{
...
}
比較標(biāo)準(zhǔn)吧术奖,只是太繁瑣,如果項目要求查詢必須用get轻绞,那么這個就太長了采记,很容易超出字符數(shù)的限制。
- 方案二:
title:[401, '某某某']
這個比較簡潔政勃,字段名稱作為key唧龄,后面跟一個數(shù)組,第一個元素是查詢條件奸远,第二個元素是查詢關(guān)鍵字既棺,如果是范圍查詢,那么第二個元素是數(shù)組懒叛。
缺點就是沒有明確的區(qū)分說明丸冕,不看定義,說知道數(shù)組里面都是啥東東芍瑞。
查詢方式為啥又是數(shù)字晨仑?
這個,個人習(xí)慣吧,我是特別喜歡數(shù)字的形式洪己,因為“好識別”妥凳,當(dāng)然這個不是針對程序員的,而是針對代碼的答捕。其實這一套查詢解決方案逝钥,包括前后端的,都不用程序員去讀去寫拱镐,而是可視化的方式來實現(xiàn)的艘款,所以看到的是數(shù)字對應(yīng)的name。