SQL可以在嵌套的SELECT中的WHERE中使用用例吗?

SQL可以在嵌套的SELECT中的WHERE中使用用例吗?,sql,case,Sql,Case,我正在尝试将某些记录放入第二个查询的子集中。我一直得到的错误是:多次使用表别名:Eqanswer-SQL语句中的错误位置是:199行:3列:22这只是最后一条消息,我缺少解决它的明显答案,但我真的想知道这是否有效 SELECT e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum FROM ( SELECT DISTINCT entitynum

我正在尝试将某些记录放入第二个查询的子集中。我一直得到的错误是:多次使用表别名:Eqanswer-SQL语句中的错误位置是:199行:3列:22这只是最后一条消息,我缺少解决它的明显答案,但我真的想知道这是否有效

    SELECT 
        e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
    FROM 
        ( SELECT 
            DISTINCT entitynum 
          FROM Eqanswer, entities
                LEFT JOIN Eqanswer 
                    ON (Eqanswer.entitynum = entities.entitynum) 
          WHERE 
                entities.partyID LIKE
                    CASE 
                        WHEN (entities.partyID LIKE '%Joe%' 
                            OR entities.partyID LIKE '%Bob%' 
                            OR entities.partyID LIKE '%Bill%') 
                        THEN
                            (eqanswer.entityrole = 'F_TL' 
                            AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
                        ELSE
                            (eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160 
                            AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
                        END  
        ) AS bs  

        LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
        LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
    WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
    OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
    OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
    ORDER BY e.entitynum
我尝试了以下两种方法:

    SELECT 
    e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
    FROM ( SELECT 
        DISTINCT entitynum 
            FROM Eqanswer, entities
            LEFT JOIN Eqanswer 
                ON (Eqanswer.entitynum = entities.entitynum) 
      WHERE 
            entities.partyID 
                CASE 
                    WHEN (entities.partyID LIKE '%Joe%' 
                        OR entities.partyID LIKE '%Bob%' 
                        OR entities.partyID LIKE '%Bill%') 
                    THEN
                        (eqanswer.entityrole = 'F_TL' 
                        AND eqanswer.fieldnum = 160
                        AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
                    ELSE
                        (eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160 
                        AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
                    END  
    ) AS bs  

    LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
    LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
    WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
    OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
    OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
    ORDER BY e.entitynum

两者都是抛出错误,但这就像是语法错误,我的错

你真的有两次Eqanswer:

编辑

好的,这个子选择在很多地方都是错误的:我将把我的注释添加为字符串,而不是注释,以使它们更加突出

SELECT  entitynum 
FROM Eqanswer, entities
LEFT JOIN Eqanswer             'this is the duplicate table name'
    ON (Eqanswer.entitynum = entities.entitynum) 
WHERE entities.partyID LIKE    
    'LIKE implies that partyID AND the CASE expression are both strings'
    CASE 
        WHEN (entities.partyID LIKE '%Joe%' 
                        OR entities.partyID LIKE '%Bob%' 
                        OR entities.partyID LIKE '%Bill%') 
        THEN (eqanswer.entityrole = 'F_TL' 
             AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
             'but THIS is a boolean expression'
        ELSE (eqanswer.entityrole = 'F_TL' 
             AND eqanswer.fieldnum = 160 
             AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
             'and THIS too'
    END  
) AS bs  
因此,LIKE对数据类型未知的列进行操作,而CASE则生成布尔表达式。最有可能的是,line entities.partyID LIKE只是一个复制粘贴错误。让我们忽略它吧

不能将布尔表达式作为CASE子句的结果返回。因此,您需要重写CASE以返回一个整数,并比较该值以匹配预期的WHERE条件

可能是这样的:

WHERE 
    CASE 
        WHEN (entities.partyID LIKE '%Joe%' 
                        OR entities.partyID LIKE '%Bob%' 
                        OR entities.partyID LIKE '%Bill%') 
        THEN
            CASE WHEN  (eqanswer.entityrole = 'F_TL' 
                 AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
            THEN 1 ELSE 0 END
        ELSE
            CASE WHEN (eqanswer.entityrole = 'F_TL' 
                 AND eqanswer.fieldnum = 160 
                 AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
            THEN 1 ELSE 0 END
    END = 1
您确实拥有Eqanswer两次:

编辑

好的,这个子选择在很多地方都是错误的:我将把我的注释添加为字符串,而不是注释,以使它们更加突出

SELECT  entitynum 
FROM Eqanswer, entities
LEFT JOIN Eqanswer             'this is the duplicate table name'
    ON (Eqanswer.entitynum = entities.entitynum) 
WHERE entities.partyID LIKE    
    'LIKE implies that partyID AND the CASE expression are both strings'
    CASE 
        WHEN (entities.partyID LIKE '%Joe%' 
                        OR entities.partyID LIKE '%Bob%' 
                        OR entities.partyID LIKE '%Bill%') 
        THEN (eqanswer.entityrole = 'F_TL' 
             AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
             'but THIS is a boolean expression'
        ELSE (eqanswer.entityrole = 'F_TL' 
             AND eqanswer.fieldnum = 160 
             AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
             'and THIS too'
    END  
) AS bs  
因此,LIKE对数据类型未知的列进行操作,而CASE则生成布尔表达式。最有可能的是,line entities.partyID LIKE只是一个复制粘贴错误。让我们忽略它吧

不能将布尔表达式作为CASE子句的结果返回。因此,您需要重写CASE以返回一个整数,并比较该值以匹配预期的WHERE条件

可能是这样的:

WHERE 
    CASE 
        WHEN (entities.partyID LIKE '%Joe%' 
                        OR entities.partyID LIKE '%Bob%' 
                        OR entities.partyID LIKE '%Bill%') 
        THEN
            CASE WHEN  (eqanswer.entityrole = 'F_TL' 
                 AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
            THEN 1 ELSE 0 END
        ELSE
            CASE WHEN (eqanswer.entityrole = 'F_TL' 
                 AND eqanswer.fieldnum = 160 
                 AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
            THEN 1 ELSE 0 END
    END = 1


CASE是一个表达式,返回一个标量值。假设是SQL Server,它既不能返回谓词也不能返回布尔值,因为没有布尔类型。您使用的是什么样的SQL?我使用SQL从.Net、无Express、tSQL或Server查询Advantage DB。仅用于查询DB.CASE的语言是一个表达式并返回标量值。假设是SQL Server,它既不能返回谓词也不能返回布尔值,因为没有布尔类型。您使用的是什么样的SQL?我使用SQL从.Net、无Express、tSQL或Server查询Advantage DB。只需要查询DB的语言。修复了多个Eqanswer,但它不喜欢WHERE子句后面的like语句。我不需要WHERE后面的CASE entities.partyID中使用的字段吗?当我尝试以下操作时,代码检查没有任何错误,但是我仍然没有运行它。CASE 1作为CASE语句中的lead。修复了多个Eqanswer,但它不喜欢WHERE子句后面的like语句。我不需要在CASE entities中使用字段。partyID在WHERE之后?当我尝试以下操作时,我在代码检查中没有发现任何错误,但是我仍然没有让它运行。CASE 1作为CASE语句的前导。我喜欢这段代码,但它抛出了以下错误:运算符的操作数无效:like-SQL语句中的错误位置是:279 line:5 column:26 remove like,我想您不需要它,直到不喜欢这个案例。在CASE语句周围出现错误。错误:未找到预期的词法元素:在SELECT语句的FROM关键字之后解析表名时出现问题。-SQL语句中的错误位置是:279行:5列:10好的,我为您创建了一个SQL FIDLE示例-我喜欢这段代码,但它引发了以下错误:运算符的操作数无效:like-SQL语句中的错误位置是:279行:5列:26删除like,我认为您不需要它,直到不喜欢这种情况。在CASE语句周围出现错误。错误:未找到预期的词法元素:在SELECT语句的FROM关键字之后解析表名时出现问题。-SQL语句中的错误位置是:279行:5列:10好的,我已经为您创建了一个SQL FIDLE示例-
SELECT 
        e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
    FROM 
        ( SELECT 
            DISTINCT entitynum 
         /* THIS NEEDS TO BE CHANGED {Eqanswer} used 2 times without any alias */
          FROM Eqanswer, entities
                LEFT JOIN Eqanswer 
                    ON (Eqanswer.entitynum = entities.entitynum) 
          WHERE 
                entities.partyID LIKE  /* why you need this ?? */
                    CASE 
                        WHEN (entities.partyID LIKE '%Joe%' 
                            OR entities.partyID LIKE '%Bob%' 
                            OR entities.partyID LIKE '%Bill%') 
                        THEN
                            (eqanswer.entityrole = 'F_TL' 
                            AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
                        ELSE
                            (eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160 
                            AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
                        END  
        ) AS bs  

        LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
        LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
    WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
    OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
    OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
    ORDER BY e.entitynum