在PeopleSoft中,我试图从单元格的中间获取一些文本。我在创建字符串表达式来执行此操作时遇到了麻烦。单元格中的数据看起来像这样(我已经 bolding 我想要捕获的内容)
||高级副总裁:第一人
||采访完成人:第二个人
||信息:员工列出了很多东西。
||不相关的问题? ÿ
||经理向以下人员提供了数据:第三个人
我已经提交了一个问题here,我已经接近了。这是我到目前为止的内容:
substring(J.HR_NP_NOTE_TEXT,CHARINDEX('|| Info:',J.HR_NP_NOTE_TEXT)+8,100),CHARINDEX('||',J.HR_NP_NOTE_TEXT)
问题在于,这不会在||处停止。如果我能得到更好的解决方案,那么我可以得到第三组“ ||”之后的文本并在第四组“ ||”之前停止。
答案 0 :(得分:1)
在没有看到实际输出的情况下,我认为您会发现问题与子字符串的实际工作方式有关。
从Transact SQL文档中,我可以在线查看(https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-2017) 子字符串带有3个参数: SUBSTRING(表达式,开始,长度)
您具有表达式-J.HR_NP_NOTE_TEXT 您开始了-CHARINDEX('||信息:',J.HR_NP_NOTE_TEXT)+8,100)-我不确定100%为什么只在查找'||。信息:'不过100个字符之后?
但是,当您计算长度-CHARINDEX('||',J.HR_NP_NOTE_TEXT)时,您将无法获得预期的结果。假设它忽略了字符串中较早的||(会吗?),它将返回字符串中的位置,而不是实际长度。
更合适的计算方法如下 (CHARINDEX('||',J.HR_NP_NOTE_TEXT)-CHARINDEX('|| Info:',J.HR_NP_NOTE_TEXT)+8,100)) 即检测“ ||”之间的差异信息:”位置和下一个“ ||”。
进行整个查询: 子字符串(J.HR_NP_NOTE_TEXT,CHARINDEX('||信息:',J.HR_NP_NOTE_TEXT)+8,100),(CHARINDEX('||',J.HR_NP_NOTE_TEXT)-CHARINDEX('||信息:',J.HR_NP_NOTE_TEXT)+ 8,100))。
由于我不确定您的CHARINDEX是否在寻找“ ||”,因此我可能会尝试使用此方法-查找下一个“ ||”在“ ||”之后信息:' 子串(J.HR_NP_NOTE_TEXT,CHARINDEX('||信息:',J.HR_NP_NOTE_TEXT)+8,100),(CHARINDEX('||',J.HR_NP_NOTE_TEXT,CHARINDEX('|| Info:',J.HR_NP_NOTE_TEXT)+8,100 ))-CHARINDEX('||信息:',J.HR_NP_NOTE_TEXT)+8,100))。
尽管这是您要查询的PS查询问题,但您可能还会从主要关注您正在使用的SQL语言的人员那里得到更好的答案,因为这并不是严格意义上的PeopleSoft唯一问题。 / p>
希望有帮助!