Oracle 当它呈现一个“聪明的引语”时,会将它们显示为倒置的问号(可能有一个技术术语,我不知道)

Oracle 当它呈现一个“聪明的引语”时,会将它们显示为倒置的问号(可能有一个技术术语,我不知道),oracle,plsql,peoplesoft,analytic-functions,ora-00907,Oracle,Plsql,Peoplesoft,Analytic Functions,Ora 00907,因此,当我测试建议时(比如按照@Rene Nyffenegger和@WayneH的建议固定引号/逗号顺序),我会从我的基本测试查询开始,添加表达式并测试它,将其保存为单独的查询。如果它们不起作用,我会回到基本查询。这样我就可以迭代更改并将潜在的测试保存为不同的版本 我的错误是没有保存不同的版本,离开应用程序并返回。当您保存查询,离开页面,转到Peoplesoft中的其他地方,然后返回到open query Manager时,它实际上会向您显示它正在进行字符转换。除非你那样做,否则你看不见它。即使

因此,当我测试建议时(比如按照@Rene Nyffenegger和@WayneH的建议固定引号/逗号顺序),我会从我的基本测试查询开始,添加表达式并测试它,将其保存为单独的查询。如果它们不起作用,我会回到基本查询。这样我就可以迭代更改并将潜在的测试保存为不同的版本

我的错误是没有保存不同的版本,离开应用程序并返回。当您保存查询,离开页面,转到Peoplesoft中的其他地方,然后返回到open query Manager时,它实际上会向您显示它正在进行字符转换。除非你那样做,否则你看不见它。即使查询管理器正在这样做。因此,它抛出了一个字符查询管理器无法识别的字符,但没有向我显示它无法识别的字符

我最近买了一台新的工作电脑,现在我已经禁用了智能报价自动替换功能,以备将来使用

第二,“查询管理器:部分: 在我开始工作的版本中,我使用了将“IN”函数包装到Case语句中的方法。我发现很多SQL函数在使用“plain”时(正如我通过从Oracle的定义页面复制粘贴并填充适当的变量来定义它们)倾向于给出PS/Query(查询管理器)但是如果您将它们包装在一个CASE…WHEN…END语句中,该语句评估函数的结果,然后构建一个基于该结果的特定值进行选择的条件,那么函数将正常工作并正确显示结果

例如,设置这个表达式(如@qyb2zm302中的示例)。我使用的代码与原始示例中的代码不同,但它们的工作原理相同(它们都是五位字符类型的代码,由三位数字、一个破折号和两位数字组成)

然后设定一个标准:

    AND 
        Case when  E.CATEGORY_CD  IN
                  ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
                   then 'true' 
                   else 'false' 
        end 
   = 'true'
它将运行到完成,并返回包含该类别代码的所有行

如果您不想这样做,可以像@qyb2zm302的方法2那样做。在查询管理器中,唯一的缺点是您必须将它们输入到“列表”中的各个行中,并且一次只能复制粘贴25

将其包装在Case语句中,可以将其直接粘贴到表达式中,这对于较大的列表更好

解决: 上面是我使用的代码,为了简洁起见,它稍微简化了一点,但它是有效的

  • 在列表中通过本机查询管理器选项工作,只要手动填充列表即可

  • D.CATEGORY_CD='005-00'或只要将其包装在案例陈述中就可以使用

  • D.CATEGORY_CD IN('015-00'、'015-06'、'015-10'、'615-07')只要您将其包装在案例陈述中即可使用

  • Peoplesoft不喜欢智能引号。如果您直接从Word复制引号,上述任何一项都不起作用,但除非您在编辑模式下保存、离开并返回同一查询,否则您将看不到它

  • 格式很重要。正如Rene和Wayne所指出的,上述所有内容都需要正确的逗号/引号格式。意思是:('xxx-xx'、'xxx-01'、'xxx-02')等


  • 感谢所有在这方面提供帮助的人!我想我以前在任何问题上都没有这么努力过,但我想这是学习过程的一部分。因为所有张贴的答案都是有效和正确的(或者至少是较大的“正确”的一部分),我将标记它们。

    Hi@Rhamblin,我已经对标签进行了
    oracle
    ,因为这是相关的,更多的人会看到它。你是对的,这当然是一堵文字墙。很抱歉,我看不出是什么导致了你上一次查询中的
    ora-00907
    ;但是,你可能应该将其括起来
    ,或者你可以选择它很多你不想要的东西。另外,
    ps_itm_cat_tbl.effdt
    是否真的有可能成为
    >sysdate
    ?谢谢Ben。我想你指的是第二个SQL中的“OR”,对吧?我不确定查询管理器的SQL版本是否有点不对劲,但在GUI中它有“OR”嵌套作为前面的一部分,并且。此外,查询管理器将自动生成生效日期子查询。我不确定我是否能关掉它。我将尝试在这个或标准中加入一个明确的括号,看看这是否有效。感谢您添加了新的Oracle标记和信息。@Ben,刚刚试着用括号括起那个或段。所以类似于和D.CATEGORY_CD='005-00'(或D.CATEGORY_CD IN('015-00,'015-06,'015-10,'015-15,'615-07'))的东西得到消息=ORA-00933:SQL命令没有正确结束,而D.CATEGORY_CD='005-00'或(D.CATEGORY_CD IN('015-00,'015-06,'015-10,'015-15,'615-07'))得到相同的907错误,但这不会导致你的错误。但是,它可能会导致逻辑错误。根据Oracle评估查询的方式,
    可能导致返回与此条件匹配的每一行。这可能是您想要的,但以下情况更常见:
    从表1 t1、表2 t2中选择列,其中t1.id=t2.id和(t1.blah='a'或t1.oh='b')以及t2.blah='f'
    。这将同时匹配括号中的
    条件以及
    s。这是一个很好的资源,感谢您的关注。我的第一次尝试是在每个代码周围加上单引号,这得到了相同的错误。我在那个网站上看到一个参考,建议使用“内部单引号的另一个单引号”。不过,我想我可能误解了他的意思。我尝试将其更改为read和D.CATEGORY_CD='005-00'或D.CATEGORY_CD IN('015-00,'015-06,'015-10,'015-15,'615-07'),但它仍然抛出相同的错误。因此,如果将其替换为
    D.CATEGORY_CD IN('015-0')
    
    Code     Vendor    Amount
    123-45   Acme     $5000.00
    123-45   Apple    $4200.00
    123-46   Acme     $750.00
    
    SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM ( A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
      FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E, PS_PYMNT_VCHR_XREF F 
      WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
         AND A.PO_ID = B.PO_ID 
         AND A.LINE_NBR = B.LINE_NBR 
         AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
         AND B.PO_ID = C.PO_ID 
         AND D.CATEGORY_ID = B.CATEGORY_ID 
         AND D.EFFDT = 
            (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
            WHERE D.SETID = D_ED.SETID 
              AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
              AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
              AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
              AND D_ED.EFFDT <= SYSDATE) 
         AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
         AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
         AND D.CATEGORY_CD LIKE :1 
         AND E.VENDOR_ID = C.VENDOR_ID 
         AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
         AND A.VOUCHER_ID = F.VOUCHER_ID 
      ORDER BY 1
    
    SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM (  A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
      FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E,  PS_PYMNT_VCHR_XREF F 
      WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
         AND A.PO_ID = B.PO_ID 
         AND A.LINE_NBR = B.LINE_NBR 
         AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
         AND B.PO_ID = C.PO_ID 
         AND D.CATEGORY_ID = B.CATEGORY_ID 
         AND D.EFFDT = 
            (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
            WHERE D.SETID = D_ED.SETID 
              AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
              AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
              AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
              AND D_ED.EFFDT <= SYSDATE) 
         AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
         AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
         AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 
         AND E.VENDOR_ID = C.VENDOR_ID 
         AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
         AND A.VOUCHER_ID = F.VOUCHER_ID 
      ORDER BY 1
    
     D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 
    
    '015-00,'' '
    
    015-06,
    
    OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'')
    
    OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07')
    
    AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07') 
    
    AND D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07', '005-00')
    
    Case when  E.CATEGORY_CD  IN
                      ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
        then 'true' 
        else 'false' 
        end 
    
        AND 
            Case when  E.CATEGORY_CD  IN
                      ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
                       then 'true' 
                       else 'false' 
            end 
       = 'true'