所以我使用解码函数编写一个select查询,并将结果设置为变量。
问题是,当没有线条时,我总是没有结果错误。
我尝试使用值进行解码,然后计算,但没有结果。
SELECT decode(count(id), 0, (select id from t_table where intitule = '?' and id_type = 93), id) into v_id
from t_table where intitule = null
group by id;
SELECT decode(id, null, (select id from t_table where intitule = '?' and id_type = 93), id) into v_id
from t_table where intitule = null
group by id;
但是,因为没有要解码的行,所以它不起作用。
所以,我的查询必须得到一个id到v_id,其中intitule =一个值,否则它会带回一个存在于t_table中的默认值。
当我得到0行时,我发出了无结果错误。
例如,我进入了t_table这三行
id | intitule | id_type
1 | ? | 5
2 | electricien | 5
3 | mécanicien | 4
我将指定我没有指定的地方,因此intitule = null
所以这会带回0行。
但我知道它的id_type,所以如果我没有找到任何行(就是这种情况),我会为我知道的id_type带回默认值(?)(5)。
所以,最后,我必须1
进入v_id
。
但如果我有intitule = 'electricien'
,那么我会2
进入v_id
。
这样更好吗?
有人能帮助我吗?
答案 0 :(得分:1)
很抱歉,您正在做的事情存在多个缺陷。
首先where intitule = null
永远不会奏效。 NULL不等于任何东西,所以=不能用它。这必须是where intitule is null
。
但是,你想要选择一行。那你为什么要按ID分组呢?按ID分组意味着:每个ID获取一条记录。这根本不是你想要的。您想要一个 ID。
看来,你认为intitule是独一无二的?然后只需选择想要的intitule的ID。如果我理解正确,没有记录,其中intitule为null,对吧?如果没有给出要查找的文件,您只想选择特定记录。所以在你的where子句中使用OR:要么是intitule,要么必须匹配或者没有给出,而且intitule必须匹配'?'和id_type必须是93。
select id
into v_id
from t_table
where intitule = vi_intitule
or (vi_intitule is null and intitule = '?' and id_type = 93);
答案 1 :(得分:0)
试试这个:
SELECT
decode
(
select count(id) from t_table where id= e.id group by id,
0,
(select id from t_table where intitule = '?' and id_type = 93),
id
)
into v_id
FROM t_table e where intitule is null
GROUP BY id;