选择语句进入解码功能

时间:2014-06-30 07:45:50

标签: sql oracle10g

所以我使用解码函数编写一个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

这样更好吗?

有人能帮助我吗?

2 个答案:

答案 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;