有没有办法使此case语句起作用?

问题描述 投票:1回答: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-ES-2019-AE',需要与'IT-7003-Master-Online-Content'相匹配]

无论如何,我接受了您的建议并执行以下操作:

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;

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

results of 'successful' query

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

我在下面的代码中收到以下错误:错误:AND的参数必须为布尔值类型,而不是不同字符的第9行:和大小写^ SQL状态:42804字符:300这...

postgresql blackboard
1个回答
1
投票

首先,实际上不需要使用这种复杂的case语句。如果前8个字符不匹配,那么肯定是前9个,10个或11个都不匹配,对吗?因此,只需清除整个内容,然后仅检查前8个:

© www.soinside.com 2019 - 2024. All rights reserved.