# 校核分类
> 校核规则主要分为无前提条件校核和有前提条件校核两个部分。
## 无前提条件校核
是指该部分校核,不存在前置条件,直接作为校核(查询)依据,该部分校核多为单条件,
或为某指标项为空(或未填写);
或为某指标项包含特殊字符串(多使用正则匹配);
或为某指标项不为6或8位数字(由于当前描述时间指标项均为字符串类型,可以填写到月,也可以精确的日,其实潜在描述不为 `时间字符串` );
或为某指标项是否超出代码值范围等。
< tabs >
< tab title = "指标项为空(或未填写)" >
< code-block lang = "sql" >
-- “政治面貌”为空
select count(1) from A01_temp WHERE 1=1 AND A01_temp.A0000 = :A0000
AND (A0141 is null or A0141='')
/*
说明:xx 为空 ,主要是针对未录入操作,针对MySQL数据库存在null和空字符串两种状态,索引需要分开进行限制
*/
< / code-block >
< / tab >
< tab title = "指标项包含特殊字符串" >
< code-block lang = "sql" >
-- 姓名中含有除“·”之外的特殊符号、数字或字母
select count(1) from A01_temp WHERE 1=1 AND A01_temp.A0000 = :A0000
AND (
A0101 regexp '[0-9a-zA-Z]'OR
A0101 regexp '[[:digit:]]' OR
A0101 regexp '[[:punct:]]' OR
A0101 regexp '[:whitespace:]' OR
A0101 regexp '[[:cntrl:]]' OR
A0101 regexp '[[:space:]]' OR
A0101 LIKE '%(%' OR
A0101 LIKE '%)%' OR
A0101 LIKE '%(%' OR
A0101 LIKE '%)%' OR
A0101 like '% %' OR A0101 like '% %'
)
/*
说明:xx 包含特殊符号、数字或字母 ,主要是使用正则进行匹配,数字“0-9”、字母“A-Za-z”等
*/
< / code-block >
< / tab >
< tab title = "指标项不为6或8位数字" >
< code-block lang = "sql" >
-- “出生年月”不为6或8位数字
select count(1) from A01_temp WHERE 1=1 AND A01_temp.A0000 = :A0000
AND isDate(A0107)=0 and A0107 is not null and A0107 != ''
/*
说明:xx 不为6或8位数字 ,主要是针对时间字段,但是数据库是使用字符串进行存储的,有的时候会精确到日,有时候精确到月。
其中:isDate() 是在数据库内置的判断时间字符串函数
*/
< / code-block >
< / tab >
< tab title = "指标项是否超出代码值范围" >
< code-block lang = "sql" >
-- “民族”超出代码值范围
select count(1) from A01_temp WHERE 1=1 AND A01_temp.A0000 = :A0000
AND A0117 NOT IN (
SELECT code_value FROM code_value WHERE code_type = 'GB3304'
and CODE_STATUS='1' and CODE_LEAF='1')
and A0117 is not null and A0117 != ''
/*
说明:xx 超出代码值范围 ,主要是针对使用字典框或下拉框类别,应该正确选择字典字符串,非范围内或废弃字典均会被筛选出来。
*/
< / code-block >
< / tab >
< / tabs >
## 有前提条件校核
是指该部分校核,不存在前置条件,直接作为校核(查询)依据,该部分校核多为单条件,
或为某指标项为空(未填写);
或为某指标项(时间指标)不在某时间范围,或与校核截至时间比较;
或为某指标项是否超出代码值范围等。
> 补充:其中也存在某些前提条件,主要看校核描述是否存在前提条件因子。
> <code-block lang="sql">-- 机构信息集“机构类别”超出代码值范围或为根节点代码值
> <![CDATA[select count(1) from B01_temp WHERE 1=1 AND B01_temp.B0111 = :B0111 AND B0194='1' AND B0131 IS NOT NULL AND B0131<>'' AND B0131 NOT IN(SELECT code_value FROM code_value WHERE code_type='ZB04' and CODE_STATUS='1' and CODE_LEAF='1')]]>
> </code-block>
> 存在前提条件“属于法人单位的机构”才进行
> (补充:<shortcut>WHERE 1=1 AND B01_temp.B0111 = :B0111 AND</shortcut>特定格式)
## 每年变动规则
该部分校核规则多与指定时间有关,脚本中会写死具体条件。当汇数年度发生变化,该部分年份信息,也需要跟着修改。
## 总结
数据校核是一项解决数据质量重要手段,但是往往校核规则会被简化成俗语,有些精简的比较深的话,里面包含大量的前提条件;同时有些被简化的俗语,按照直观意思无法理解。
> `有些精简的比较深的话,里面包含大量的前提条件`:涉及存在前提条件,需要积累一些公务员人事的常识,或者咨询定制规则的用户。
> `被简化的俗语,按照直观意思无法理解`:需要咨询定制规则的用户,用户目的到底是什么。
往往在完成校核条件定义的时候,开发人员常使用固定SQL语句进行实现,当然也可以通过校核方案进行配置,但是这些条件都仅仅是针对简单规则易用。
### 最后结论: `咨询定制规则的用户`