Oracle 当它呈现一个“聪明的引语”时,会将它们显示为倒置的问号(可能有一个技术术语,我不知道)
因此,当我测试建议时(比如按照@Rene Nyffenegger和@WayneH的建议固定引号/逗号顺序),我会从我的基本测试查询开始,添加表达式并测试它,将其保存为单独的查询。如果它们不起作用,我会回到基本查询。这样我就可以迭代更改并将潜在的测试保存为不同的版本 我的错误是没有保存不同的版本,离开应用程序并返回。当您保存查询,离开页面,转到Peoplesoft中的其他地方,然后返回到open query Manager时,它实际上会向您显示它正在进行字符转换。除非你那样做,否则你看不见它。即使查询管理器正在这样做。因此,它抛出了一个字符查询管理器无法识别的字符,但没有向我显示它无法识别的字符 我最近买了一台新的工作电脑,现在我已经禁用了智能报价自动替换功能,以备将来使用 第二,“查询管理器:部分: 在我开始工作的版本中,我使用了将“IN”函数包装到Case语句中的方法。我发现很多SQL函数在使用“plain”时(正如我通过从Oracle的定义页面复制粘贴并填充适当的变量来定义它们)倾向于给出PS/Query(查询管理器)但是如果您将它们包装在一个CASE…WHEN…END语句中,该语句评估函数的结果,然后构建一个基于该结果的特定值进行选择的条件,那么函数将正常工作并正确显示结果 例如,设置这个表达式(如@qyb2zm302中的示例)。我使用的代码与原始示例中的代码不同,但它们的工作原理相同(它们都是五位字符类型的代码,由三位数字、一个破折号和两位数字组成) 然后设定一个标准:Oracle 当它呈现一个“聪明的引语”时,会将它们显示为倒置的问号(可能有一个技术术语,我不知道),oracle,plsql,peoplesoft,analytic-functions,ora-00907,Oracle,Plsql,Peoplesoft,Analytic Functions,Ora 00907,因此,当我测试建议时(比如按照@Rene Nyffenegger和@WayneH的建议固定引号/逗号顺序),我会从我的基本测试查询开始,添加表达式并测试它,将其保存为单独的查询。如果它们不起作用,我会回到基本查询。这样我就可以迭代更改并将潜在的测试保存为不同的版本 我的错误是没有保存不同的版本,离开应用程序并返回。当您保存查询,离开页面,转到Peoplesoft中的其他地方,然后返回到open query Manager时,它实际上会向您显示它正在进行字符转换。除非你那样做,否则你看不见它。即使
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语句中,可以将其直接粘贴到表达式中,这对于较大的列表更好
解决:
上面是我使用的代码,为了简洁起见,它稍微简化了一点,但它是有效的
感谢所有在这方面提供帮助的人!我想我以前在任何问题上都没有这么努力过,但我想这是学习过程的一部分。因为所有张贴的答案都是有效和正确的(或者至少是较大的“正确”的一部分),我将标记它们。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'