【达梦数据库】条件过滤SQL

<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') &gt;= ADD_MONTHS(TRUNC(SYSDATE), -12 * 5)
            AND TO_DATE(FLOW.ESTIBLISH_TIME, 'YYYY-MM-DD') &lt; 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 非空且不全是空白字符,则条件为真。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值