oraclesql中的字符比较
我在sql中有以下查询oraclesql中的字符比较,sql,oracle,Sql,Oracle,我在sql中有以下查询 SELECT SUM(WT.TRANSACTION_QUANTITY * WTA.RATE_OR_AMOUNT) FROM WIP_TRANSACTION_ACCOUNTS WTA, WIP_TRANSACTIONS WT WHERE WTA.TRANSACTION_ID = WT.TRANSACTION_ID AND WTA.ORGANIZATION_ID = WT.ORGANIZATION_ID AND WTA.ACCOUNTING_LINE_TYPE =
SELECT SUM(WT.TRANSACTION_QUANTITY * WTA.RATE_OR_AMOUNT)
FROM WIP_TRANSACTION_ACCOUNTS WTA, WIP_TRANSACTIONS WT
WHERE WTA.TRANSACTION_ID = WT.TRANSACTION_ID
AND WTA.ORGANIZATION_ID = WT.ORGANIZATION_ID
AND WTA.ACCOUNTING_LINE_TYPE =7
AND WTA.WIP_ENTITY_ID = 1757481
AND NVL(wt.ATTRIBUTE1,'-') LIKE '-'
AND NVL(wt.ATTRIBUTE2,'-') LIKE '-';
它返回值,但使用过程中与p_productioncard和p_SHIFT参数相同的查询,它返回空值
这是程序
FUNCTION get_value3 ( p_wip_entity_id NUMBER
, P_productioncard VARCHAR2
, P_SHIFT VARCHAR2)
RETURN NUMBER is
l_total number;
begin
SELECT SUM(WT.TRANSACTION_QUANTITY* WTA.RATE_OR_AMOUNT)
INTO l_total
FROM WIP_TRANSACTION_ACCOUNTS WTA, WIP_TRANSACTIONS WT
WHERE WTA.TRANSACTION_ID = WT.TRANSACTION_ID
AND WTA.ORGANIZATION_ID = WT.ORGANIZATION_ID
AND WTA.ACCOUNTING_LINE_TYPE =7
AND WTA.WIP_ENTITY_ID = p_wip_entity_id
AND NVL(wt.ATTRIBUTE1,'-') LIKE p_productioncard
AND NVL(wt.ATTRIBUTE2,'-') LIKE P_SHIFT;
RETURN l_total;
END;
在下面的SQL中,我调用这个函数
select get_value3 ( 1757481, '-', '-') from dual;
我没有看到问题,但是您没有提供任何CREATETABLE或insert语句供我们尝试复制问题 我做了一个小测试,它按预期工作:
with sample_data as (select 1 id, 10 val1, 10 val2, 'a' val3 from dual union all
select 1 id, 20 val1, 20 val2, null from dual union all
select 2 id, 30 val1, 30 val2, null from dual)
select sum(val1*val2) result1
from sample_data
where nvl(val3, '-') like '-'
and id = 1;
RESULT1
----------
400
create or replace function test_fn (p_id in number,
p_val3 in varchar2)
return number
is
l_total number;
begin
with sample_data as (select 1 id, 10 val1, 10 val2, 'a' val3 from dual union all
select 1 id, 20 val1, 20 val2, null from dual union all
select 2 id, 30 val1, 30 val2, null from dual)
select sum(val1*val2) result
into l_total
from sample_data
where nvl(val3, '-') like p_val3
and id = p_id;
return l_total;
end;
/
select test_fn(1, '-') result2
from dual;
RESULT2
----------
400
(1) 这些查询是不同的。(2) 您应该学会使用正确的显式
连接
语法。刚才删除了1行,这是因为还有其他行,但我认为这里的查询应该很简单。和NVL(wt.ATTRIBUTE1,“-”)类似于“-”
看起来是一种非常复杂的方式来表示,wt.ATTRIBUTE1为NULL
;这就是你想要的吗?@Boneist-在我看来,NVL结构的意思是“wt.ATTRIBUTE1=”-“或者wt.ATTRIBUTE1为空”。我自己更喜欢这个“扩展”版本,因为NVL很难解释;我假设连字符不是该列中的实际值。