Field 字符串函数
MySQL中,Field() 函数 返回一个指定的值 在给定的列表中的 索引
。此函数执行不区分大小写搜索。
FIELD语法
Field( name , data1 , data2 , data3 )
参数说明
- name
要查找的字段 - data1 \ data2 \ …
该字段数据(要搜索的元素)
返回值说明
- 如果列表中找到指定元素,则返回对应的
位置索引
。(索引从1开始) - 如果找不到指定元素,则返回0。
- 如果要查找的值为null,返回0.
示例
限定条件:
1. 一个公司同类型下只能查询一条
2. 优先考虑个体门店,无数据情况下再考虑“适用全部门店”,sql处理数据优先级
3. 优先查询门店1号 有数据直接返回002这条数据;若没有数据,再查询适用全部门店这条数据 进行返回
SELECT * FROM
info
WHERE
CustomerId = 'CT0010'
AND CustStoreId IN ( 'CS00068', 'CS00000' )
Id | CustomerId | CustomerName | CustStoreId | CustStoreName | Type |
---|---|---|---|---|---|
0001 | CT0010 | XX公司 | CS00000 | 适用全部门店 | 33 |
0002 | CT0010 | XX公司 | CS00068 | 门店1号 | 33 |
依照上方数据查询出来的,查出来的数据 前后顺序不一定是谁,现在我想要对数据进行一个优先级排序,例如:
- ‘CS00068’ 存在,则返回对应数据 001 ;
- ‘CS00068’ 不存在,则返回 ‘CS00000’ 对应数据 002 ;
方案一
这个方法可以偷个懒,“ 适用全部门店
” 的id是等级最低的00000
,所以其余类型的均比其大,可以倒序排序取出一条即可 。
SELECT * FROM
info
WHERE
CustomerId = 'CT0010'
AND CustStoreId IN ( 'CS00068', 'CS00000' )
ORDER BY
CustStoreId DESC LIMIT 1;
Id | CustomerId | CustomerName | CustStoreId | CustStoreName | Type |
---|---|---|---|---|---|
0002 | CT0010 | XX公司 | CS00068 | 门店1号 | 33 |
方案二
上方的“ 偷懒方式
” 是针对于限定的两条数据,当再来一个筛选条件就不太好办,这里后就可以使用sql函数 Field()
,可以对数据进行 优先级
排序。(指定元素升序降序)
SELECT * FROM
info
WHERE
CustomerId = 'CT0010'
AND CustStoreId IN ( 'CS00068', 'CS00000' )
ORDER BY
Field(CustStoreId,'CS00068','CS00099', 'CS00000')
Id | CustomerId | CustomerName | CustStoreId | CustStoreName | Type |
---|---|---|---|---|---|
0096 | CT0010 | XX公司 | CS00099 | 门店2号 | 33 |
0002 | CT0010 | XX公司 | CS00068 | 门店1号 | 33 |
0001 | CT0010 | XX公司 | CS00000 | 适用全部门店 | 33 |
Field() 与 DESC 性能
方法名 | rows | filtered | type |
---|---|---|---|
方案一 | 31 | 2.38 | range |
方案二 | 2 | 7.38 | ref |
type
:
扫描方式由快到慢 system > const > eq_ref > ref > range > index > ALLrows
:
表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
投机取巧 orderby
field 函数 orderby
毫无疑问, FIELD() 函数是精简的,性能优于前者。不易出错,并且更容易修改。