我有一个非常独特的需要让select总是返回一行
我的SQL:
select * from table1 Where (table1.pk = :p1) or (table1.fk1 = :p1)
以上SQL总是有两种返回情况:
1- my select返回两条记录: 唯一不同的是其中一个记录有数据而另一个只有ID填充数据而其余字段为空。在这种情况下,我需要返回仅在其他字段中包含数据的那个。
2-我的选择返回一条记录 在这种情况下,返回的记录只有ID字段填充数据,而其余字段为空,但这是我想要的,不需要任何进一步的处理。
请告知是否可以在一个普通的选择SQL中执行此操作。我不能使用存储过程。
答案 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;