Sql 如果找不到行,请选择“从筛选器返回值”

Sql 如果找不到行,请选择“从筛选器返回值”,sql,oracle10g,Sql,Oracle10g,我需要一个select语句,它总是至少返回一条记录。像这样的 SELECT id, date FROM mytable WHERE id = <INPUT_ID> AND date = <INPUT_DATE> UNION ALL SELECT VALUE_FROM_FILTER(id), VALUE_FROM_FILTER(date) WHERE NOT EXISTS (SELECT * FROM mytable WHERE id = <INPUT_ID>

我需要一个select语句,它总是至少返回一条记录。像这样的

SELECT id, date FROM mytable WHERE id = <INPUT_ID> AND date = <INPUT_DATE>
UNION ALL
SELECT VALUE_FROM_FILTER(id), VALUE_FROM_FILTER(date) WHERE NOT EXISTS (SELECT * FROM mytable WHERE id = <INPUT_ID> AND date = <INPUT_DATE>)
因此,如果查询返回0行,它将返回至少一行输入值。 这在SQL中可能吗

我正在使用Oracle 10.2

它只是任何未知值的替换


根据答案和评论,我将问题修改为更明显的问题

您可以根据第一个查询不返回结果的事实来断言默认的“行”:

SELECT id, date FROM mytable WHERE id = @INPUT_ID AND date = @INPUT_DATE
UNION
SELECT @INPUT_ID AS id, @INPUT_DATE AS date FROM DUAL
WHERE NOT EXISTS (SELECT * FROM mytable WHERE id = @INPUT_ID AND date = @INPUT_DATE)

我不完全确定我是否遵循,但我认为这正是你想要的:

with t as (select <INPUT ID> as input_id, <INPUT DATE> as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date = t.input_date;
。。。及查询:

with t as (select 1 as input_id, date '2013-04-21' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         1 21-APR-13

with t as (select 1 as input_id, date '2013-04-24' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         1 24-APR-13

with t as (select 2 as input_id, date '2013-04-22' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         2 22-APR-13
         2 22-APR-13

现在我已经输入了,我有一种不愉快的感觉,我回答了错误的问题,你真的想把{WHERE}转换成一个新的查询来实现这一点。我恐怕不太清楚查询和应用程序之间的交互作用。

如果输入值存储在变量中,则只需运行SELECT[@var1]、@var2]、@var3],而不包括任何表。这可能是您的联合的第一行,您将始终返回它。请注意,变量名周围的括号只是为了避开StackOverflow,以为我试图通知人们不幸的是,我在变量中没有它。查询是经过文本分析的。应用程序接受模式查询,用实过滤器替换{WHERE},然后执行它。但我没有访问该应用程序的权限,我只能编辑查询模式。但我无法以这种方式访问筛选器中的值。查询只是纯文本。也许我应该把这个问题修改得更清楚些。但是谓词是个好主意,谢谢。是的,我想我还没有解释清楚。我不知道申请需要什么数据。所以我不能选择任何具体的东西。我需要这样的东西:从FILTERid中选择VALUE,从FILTERid中选择VALUE_FILTERdate@karel-我怕你会这么说。如果您只有where子句,那么这就意味着需要对其进行解析并提取相关值,这并不是一件小事。您知道where子句中有多少个条件,或者两个固定字段是否都存在?如果有一个有限的范围内的可能的价值观,都会出现,它可以被黑客我猜,但不漂亮。我想我觉得这个要求很奇怪-应该由应用程序来处理没有数据的问题,我想..你是对的,可以解析条件以获得条件格式固定的值。应用程序将条件放在查找字符串{WHERE}的任何位置,因此我可以将该{WHERE}放在一些REGEXP_SUBSTR的内部,直接放在默认SELECT中的列中。我会试试的-谢谢你的提示@karel-如果条件格式是固定的,我想知道为什么它是动态执行的,他们不仅仅是运行查询和绑定输入值,这将使这个解决方案工作*8-而不是替换整个where子句。我可能不想知道,想想吧。顺便说一句,如果你在这个问题上加上“oracle”或“oracle10g”的标签,你会更加关注这个问题。
with t as (select 1 as input_id, date '2013-04-21' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         1 21-APR-13

with t as (select 1 as input_id, date '2013-04-24' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         1 24-APR-13

with t as (select 2 as input_id, date '2013-04-22' as input_date from dual)
select input_id, input_date
from t
left join mytable mt on mt.id = t.input_id and mt.date_fld = t.input_date;

  INPUT_ID INPUT_DAT
---------- ---------
         2 22-APR-13
         2 22-APR-13