亲爱的IT神人,小弟自学只会很基础的SQL 语法,目前遇到以下难题

一笔资料订单另一笔是比对用表格,我希望能透过SQL 资料比对

透过比对表 来找出 订单报表中最右边那栏的结果

主要是各栏位都有些不规则

  • 订单报表的ID会是单一的,但比对表的ID包含是会包含多个ID对相同结果,并且有全,代表任何ID都可以
  • ID排除同样也是多对一
  • 参数包含:比对表中的参数包含,都是短的Text, 而订单报表中的参数则是长串,只要订单报表中的参数Text contain任何比对表中的参数包含就会符合比对
  • 参数排除:与参数包含相反,订单报表中的参数,只要有被包含在参数排除内就算符合
  • 比对表中的ID排除、参数排除为空值,代表无特定排除
  • 比对表中的参数包含则代表任何参数都可以
  • 订单报表中的参数,则有空值、长度不一的无规律各种Text值
  • 之前在Excel是用布林值比对一列一列往下比对所有项目都符合目前转移到SQL我是本来是使用Like+\'%\'的查找方式搭配Left Join目前是用

    From 订单报表 left join 比对表On ID包含 like %ID%and ID排除 not like %ID%

    但是ID 包含的"全"ID不知道该怎么处理

    谢谢

    2 个回答

    0

    Zero皇

    iT邦研究生 2 级 ‧ 2025-01-13 21:21:06

    感觉你是想要下面这样?

    From 订单报表 left join 比对表
    On (ID包含 like %ID% or ID包含 = "全")
    and ID排除 not like %ID%
    

    如果可以给完整一点的SQL(like那段),可能会更看得懂一点

    0

    walljack1

    iT邦新手 5 级 ‧ 2025-01-15 19:56:05

    
    WITH RECURSIVE numbers AS (
        SELECT 1 AS n
        UNION ALL
        SELECT n + 1
        FROM numbers
        WHERE n <= 10
    )
    SELECT 
        订单报表.ID AS 订单ID,
        订单报表.参数,
        订单报表.比对结果,
        比对表.ID包含,
        比对表.比对合併,
        比对表.参数名称
    FROM 
        比对表
    LEFT JOIN 
        订单报表
    ON 
        (
            比对表.ID包含 = \'全\' OR 
            EXISTS (
                SELECT 1
                FROM (
                    SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(比对表.ID包含, \':\', n), \':\', -1)) AS single_id
                    FROM numbers
                ) AS split_ids
                WHERE 订单报表.ID LIKE CONCAT(\'%\', split_ids.single_id, \'%\')
            )
        )
        AND 
        (比对表.ID排除 IS NULL OR 订单报表.ID NOT LIKE CONCAT(\'%\', 比对表.ID排除, \'%\'));
    

    你说的是这样吗?