1

我收到以下代码的以下错误:

错误:AND 的参数必须是布尔类型,而不是类型不同的字符第 9 行:和大小写 ^ SQL 状态:42804 字符:300

这段代码做了一些事情,但我遇到的问题是案例陈述。我希望这篇文章查找两个字符串的前 11 个字符匹配的实例。如果对于给定的记录不是这样,那么查看前 10 个字符,然后是 9,然后是 8。之后,null 是可接受的结果。

select cm.course_id, cm.course_name, cmp.course_id as parentcourse, 
(select cmm.course_id
from course_main cmm
where cmm.course_id ilike '%Master%'
    and cmm.course_id not ilike '%Ground%'
    and cmm.course_id not ilike '%Surprise%'
    and cmm.course_id not ilike '%emba%'
    and cmm.row_status != 2
    and case 
         when left(cm.course_id,11) = left(cmm.course_id,11) 
            then cmm.course_id 
            else 
            case 
            when left(cm.course_id,10) = left(cmm.course_id, 10) 
                then cmm.course_id 
                else 
                case 
                when left(cm.course_id,9) = left(cmm.course_id, 9) 
                    then cmm.course_id 
                    else 
                    case 
                    when left(cm.course_id,8) = left(cmm.course_id,8) 
                        then cmm.course_id 

                    end
                end
            end
        end) as mastercourse
from course_main as cm
left join course_course cc
on cc.crsmain_pk1 = cm.pk1
left join course_main cmp
on cmp.pk1 = cc.crsmain_parent_pk1
where cm.course_id ilike '%-ES-2020-%'
    and cm.row_status != 2
    and cmp.course_id is null
    order by cm.course_id;

谢谢你的帮助,Z4。我尝试应用您的建议并且能够克服错误。这些字符串的问题是我正在尝试匹配以下内容:

环境中的“NRSG-46009-ES-2020-OA”到“NRSG-46009-Master-Online-Content”还包含以下内容:

'NRSG-46006-Master-Online-Content' 'NRSG-46003-Master-Online-Content' 'NRSG-4600-Master-Online-Content'

如果我在查看前 11 个字符之前查看前 8 个字符,则会出现不匹配的情况。所以,我先看11。如果没有任何匹配项,请查看前十个,依此类推。8 个字符串是我们 ID 模式中的底线,示例如下:

需要与“IT-7003-Master-Online-Content”匹配的“IT-7003-ES-2019-AE”

无论如何,我接受了您的建议并运行了以下命令:

select distinct cm.course_id, cm.course_name, cmp.course_id as parentcourse, 
case 
when left(cm.course_id,11) = left(cmm.course_id,11) 
    then cmm.course_id 
    else 
    case 
    when left(cm.course_id,10) = left(cmm.course_id, 10) 
        then cmm.course_id 
        else 
        case 
        when left(cm.course_id,9) = left(cmm.course_id, 9) 
            then cmm.course_id 
            else 
            case 
            when left(cm.course_id,8) = left(cmm.course_id,8) 
                then cmm.course_id 
            end
        end
    end
end as mastercourse
from course_main cm
    left join course_course cc
        on cc.crsmain_pk1 = cm.pk1
    left join course_main cmp
        on cmp.pk1 = cc.crsmain_parent_pk1
    left join course_main cmm
        on cm.pk1 = cm.pk1
where cm.course_id ilike '%-ES-2020-%'
    and cm.row_status != 2
    and cmp.course_id is null
    and cmm.course_id ilike '%Master%'
    and cmm.course_id not ilike '%Ground%'
    and cmm.course_id not ilike '%Surprise%'
    and cmm.course_id not ilike '%emba%'
    and cmm.row_status != 2
    order by cm.course_id;

这似乎有效,但我得到了重复的结果:

“成功”查询的结果

关于如何排除重复项的任何想法?

4

1 回答 1

1

首先,真的没有必要使用这么复杂的case语句。如果前 8 个字符不匹配,那么前 9 个或 10 或 11 肯定也不匹配,对吧?所以只需摆脱整个事情,只检查前 8 个:

CASE
  WHEN LEFT(cm.course_id, 8) = LEFT(cmm.course_id, 8)
    THEN cmm.course_id
END

接下来,该CASE语句需要从WHERE子句中出来并进入SELECT列表(这就是导致boolean type错误的原因):

select
  [...]
  (
    select
      CASE
        WHEN LEFT(cm.course_id, 8) = LEFT(cmm.course_id, 8)
          THEN cmm.course_id
      END
    from 
      course_main cmm
    where 
      cmm.course_id ilike '%Master%'
      and cmm.course_id not ilike '%Ground%'
      and cmm.course_id not ilike '%Surprise%'
      and cmm.course_id not ilike '%emba%'
      and cmm.row_status != 2
  ) as mastercourse
FROM
  [...]

我对您试图在此处捕获的数据一无所知,但我也强烈建议您花一些时间重新考虑相关子查询的使用。即使这正确描述了您想要的数据集,子查询也确实效率低下。我猜想它可能完全可以被LEFT JOIN主查询主体中的 a 替换(可能是从course_main自身到自身的自连接)。

于 2020-01-24T01:38:28.320 回答