Firebird SQL挑战 - 当select返回两行时返回一行包含数据

时间:2013-01-22 03:36:44

标签: sql firebird

我有一个非常独特的需要让select总是返回一行

我的SQL:

select * from table1 Where (table1.pk = :p1) or (table1.fk1 = :p1)

以上SQL总是有两种返回情况:

1- my select返回两条记录: 唯一不同的是其中一个记录有数据而另一个只有ID填充数据而其余字段为空。在这种情况下,我需要返回在其他字段中包含数据的那个。

2-我的选择返回一条记录 在这种情况下,返回的记录只有ID字段填充数据,而其余字段为空,但这是我想要的,不需要任何进一步的处理。

请告知是否可以在一个普通的选择SQL中执行此操作。我不能使用存储过程。

1 个答案:

答案 0 :(得分:3)

您可以使用first语句的select子句只获得1行。

根据您的具体情况,您可以按其余字段的顺序对结果集进行排序,以确保仅在没有数据行的情况下选择空行(在firebird 2.5中为null ,但AFAIK在最后一个版本的某个地方发生了变化,因此在应用之前请检查您的特定版本。)

您的最终查询将如下所示:

select first 1 * 
  from table1 
 where (table1.pk = :p1) 
    or (table1.fk1 = :p1)
 order by somecolumn;

somecolumn是可以包含空值的其他字段中最相关的。

您可以使用以下声明对此进行测试:

--two rows, one with ID and values and the other with ID and null
with q1 as (
      select 1 id, 'data' othercolumn
        from rdb$database
      union
      select 2 id, null othercolumn
        from rdb$database
     ) 
select first 1 *
  from q1
 order by othercolumn nulls last;

--versus:

--onw row with ID and null
with q1 as (
      select 2 id, null othercolumn
        from rdb$database
     ) 
select first 1 *
  from q1
 order by othercolumn nulls last;