<select id="findTest" resultType="com.ChainResultDto">
SELECT COUNT(distinct FLOW.CREDIT_CODE) AS result
FROM TTTTTT FLOW
INNER JOIN DDDDD DIM
ON DIM.NODE_TYPE = 'COMPANY' AND DIM.BUSINESS_ID = FLOW.CREDIT_CODE
WHERE DIM.CHAIN_ID = #{chainId}
AND LENGTH(TRIM(FLOW.DISTRICT)) != 0
<if test="null != flag and '' != flag">
AND REGEXP_LIKE(FLOW."COMPANY_TAG", '(专精特新|高新技术|高成长型|科技型|科技型中小|龙头|规上|上市)', 'i')
</if>
<if test="null != flagType and '' != flagType">
AND LENGTH(ESTIBLISH_TIME) = 10
AND SUBSTR(ESTIBLISH_TIME, 1, 4) BETWEEN '1000' AND '9999'
AND SUBSTR(ESTIBLISH_TIME, 6, 2) BETWEEN '01' AND '12'
AND SUBSTR(ESTIBLISH_TIME, 9, 2) BETWEEN '01' AND '31'
AND TO_DATE(FLOW.ESTIBLISH_TIME, 'YYYY-MM-DD') >= ADD_MONTHS(TRUNC(SYSDATE), -12 * 5)
AND TO_DATE(FLOW.ESTIBLISH_TIME, 'YYYY-MM-DD') < ADD_MONTHS(TRUNC(SYSDATE), -12)
</if>
<if test="null != flagStatus and '' != flagStatus">
AND FLOW.SOCIAL_SECURITY_STAFF_NUM is not null
</if>
</select>
代码解释
1、基本结构:
<select id="findTest" resultType="com.ChainResultDto">
SELECT COUNT(distinct FLOW.CREDIT_CODE) AS result
FROM TTTTTT FLOW
INNER JOIN DDDDD DIM
ON DIM.NODE_TYPE = 'COMPANY' AND DIM.BUSINESS_ID = FLOW.CREDIT_CODE
WHERE DIM.CHAIN_ID = #{chainId}
这段 SQL 查询使用 SELECT COUNT(distinct FLOW.CREDIT_CODE) 统计符合条件的唯一公司数量。
FROM TTTTTT FLOW 指定查询的主要数据表为 TTTTTT,并为其定义别名为 FLOW。
INNER JOIN DDDDD DIM 指定与表 DDDDD 进行内连接,并为其定义别名为 DIM。
ON DIM.NODE_TYPE = ‘COMPANY’ AND DIM.BUSINESS_ID = FLOW.CREDIT_CODE 指定内连接的条件是 DIM.NODE_TYPE 必须等于 ‘COMPANY’ 且 DIM.BUSINESS_ID 必须等于 FLOW.CREDIT_CODE。
WHERE DIM.CHAIN_ID = #{chainId} 指定过滤条件,DIM.CHAIN_ID 必须等于传入的参数 chainId。
2、可选条件:
条件1: 公司标签过滤:
<if test="null != flag and '' != flag">
AND REGEXP_LIKE(FLOW."COMPANY_TAG", '(专精特新|高新技术|高成长型|科技型|科技型中小|龙头|规上|上市)', 'i')
</if>
如果 flag 参数不为空,则添加一个条件,要求 FLOW.COMPANY_TAG 字段匹配指定的正则表达式(忽略大小写)。
该正则表达式匹配公司标签中包含以下任一关键词:专精特新,高新技术,高成长型,科技型,科技型中小,龙头,规上,上市。
条件2: 公司成立时间过滤:
<if test="null != flagType and '' != flagType">
AND LENGTH(ESTIBLISH_TIME) = 10
AND SUBSTR(ESTIBLISH_TIME, 1, 4) BETWEEN '1000' AND '9999'
AND SUBSTR(ESTIBLISH_TIME, 6, 2) BETWEEN '01' AND '12'
AND SUBSTR(ESTIBLISH_TIME, 9, 2) BETWEEN '01' AND '31'
AND TO_DATE(FLOW.ESTIBLISH_TIME, 'YYYY-MM-DD') >= ADD_MONTHS(TRUNC(SYSDATE), -12 * 5)
AND TO_DATE(FLOW.ESTIBLISH_TIME, 'YYYY-MM-DD') < ADD_MONTHS(TRUNC(SYSDATE), -12)
</if>
如果 flagType 参数不为空,则添加一系列条件来验证 ESTIBLISH_TIME 字段的格式和时间范围。
确保 ESTIBLISH_TIME 字段长度为 10。
确保 ESTIBLISH_TIME 的年、月、日部分分别在有效范围内。
将 ESTIBLISH_TIME 转换为日期格式,并确保日期在过去5年至1年之间。
条件3: 社保员工数量过滤:
<if test="null != flagStatus and '' != flagStatus">
AND FLOW.SOCIAL_SECURITY_STAFF_NUM is not null
</if>
如果 flagStatus 参数不为空,则添加一个条件,要求 FLOW.SOCIAL_SECURITY_STAFF_NUM 字段不为空。
条件4: 过滤字段为空:
LENGTH(TRIM(FLOW.DISTRICT)) != 0
这段 SQL 代码片段 LENGTH(TRIM(FLOW.DISTRICT)) != 0 的作用是检查 FLOW.DISTRICT 字段是否为空或仅包含空白字符。具体解释如下:
TRIM(FLOW.DISTRICT): 这个函数去除 FLOW.DISTRICT 字段值前后的所有空白字符。TRIM 函数可以移除字符串开头和结尾的空格、制表符、换行符等空白字符。
LENGTH(TRIM(FLOW.DISTRICT)): 这个部分计算 TRIM(FLOW.DISTRICT) 之后字符串的长度。如果 FLOW.DISTRICT 原本只包含空白字符,或者是空字符串,那么 TRIM 之后的长度会是 0。
LENGTH(TRIM(FLOW.DISTRICT)) != 0: 这个条件检查 TRIM(FLOW.DISTRICT) 的长度是否不为 0。如果 FLOW.DISTRICT 非空且不全是空白字符,则条件为真。