0

在 SOURCE 列下的视图中,我有以下值。

SRC - TERM - randomtext - LOCATION(仅供参考)

ABC DE RANDOMJIBBERISH MORE RANDOMJIBBERISH FORWARD
ARY HES RANDOMJIBBERISH MORE RANDOMJIBBERISH  BACKWARD
IGHE UER RANDOMJIBBERISH MORE RANDOMJIBBERISH  LEFT

现在我有一个查询,需要根据源查找该视图。这个工作得很好。

SELECT 
    t.DATE_, t.PX_LAST
FROM 
    THIS.TABLE_NEW t 
WHERE
    t.DATE_ >= '2003-03-02'
    AND t.DATE_ <= '2013-03-02' 
    AND t.SOURCE LIKE 'ABC DE % FORWARD' --Where the magic happens
    AND t.SOURCE LIKE '%'||'1M'||'%'
    AND t.PX_LAST is NOT NULL
ORDER BY 
    t.DATE_ ASC;

现在,问题是,当我尝试在存储过程中实现它时,我需要在我得到的参数中插入百分号。这不起作用,尤其是它使用 inSource 查找源的部分

PROCEDURE Get_It
(
    inSource VARCHAR2,
    inStartDate DATE,
    inEndDate DATE,
    inLength VARCHAR2,
    inRC1 OUT SYS_REFCURSOR
) AS
BEGIN
OPEN inRC1 FOR
SELECT t.DATE_, t.PX_LAST
FROM THIS.TABLE_NEW t WHERE

t.DATE_ >= inStartDate
AND t.DATE_ <= inEndDate 
AND t.SOURCE LIKE inSource --Where the magic needs to happen 
AND t.SOURCE LIKE '%'||length||'%'
AND t.PX_LAST is NOT NULL
ORDER BY t.DATE_ ASC;
END GET_IT;

所以基本上我需要在字符串 ( ) 的中间插入一个百分号inSource,在最后一个单词和倒数第二个单词之间,一直。我能够在查询中做到这一点,因为我可以手动将其放入字符串中,但在实际的存储过程中,我不知道如何操作字符串。

4

2 回答 2

0

在我看来,您的查询很好,但您的 inLength 参数未在游标定义中正确使用。

根据您的编辑说明,有两种可能的解决方案。

第一个选项:将 inSource 作为两个 varchar 传递,这将是所有字符串,直到空格,然后是最后一个单词

PROCEDURE Get_It
(
inSourceFirst VARCHAR2,
inSourceLast VARCHAR2,
inStartDate DATE,
inEndDate DATE,
inLength VARCHAR2,
inRC1 OUT SYS_REFCURSOR
) AS
BEGIN
OPEN inRC1 FOR
SELECT t.DATE_, t.PX_LAST
FROM THIS.TABLE_NEW t WHERE

t.DATE_ >= inStartDate
AND t.DATE_ <= inEndDate 
AND t.SOURCE LIKE inSourceFirst || '%' || inSourceLast
AND t.SOURCE LIKE '%'|| inLength ||'%'
AND t.PX_LAST is NOT NULL
ORDER BY t.DATE_ ASC;


END GET_IT;

第二种选择:使用 regexp_substr() 函数More here。然后,您的 inSource 字符串将被 regexp_replace 替换为两个 regexp_substr 函数调用,该函数调用抓取空格之前和之后的内容,并在其间附加 & 字符。就像是...

regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+{4}',1,5) || ' % ' || regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+',1,6)
于 2013-04-02T16:58:29.823 回答
0

假设您想传入一个inSourcelike的值'ABC DE FORWARD'并让程序将其转换为'ABC DE % FORWARD'-%总是在第二个和第三个单词之间 - 然后你可以搞砸并重建字符串,或者你可以做一个简单的regexp_replace()

AND t.SOURCE LIKE regexp_replace(inSource, ' ', ' % ', 1, 2)
AND t.SOURCE LIKE '%'||inLength||'%'

这将用空格填充的百分号替换空格,从位置 1(即字符串的开头)开始并且仅适用于第二个实例 - 因此它跳过第一个空格并且仅影响第二个和第三个单词之间的那个.

为了证明这一点:

select regexp_replace('ABC DE FORWARD', ' ', ' % ', 1, 2)
from dual;

REGEXP_REPLACE('
----------------
ABC DE % FORWARD
于 2013-04-02T17:39:29.120 回答