【问题标题】:prepare sql conditionally有条件地准备sql
【发布时间】:2016-11-02 18:45:47
【问题描述】:

我正在尝试准备一个 sql 查询。如果值 val3 不为 NULL,我需要准备 Query1,如果值 val3 为 NULL,我需要准备 Query2。这正在 Informix ACE 程序中进行尝试。我不想准备两个不同的选择语句,但需要在 1 个语句中处理。

查询1:

select tab1.col1
WHERE tab1.col2=val1
AND   tab1.col2=val2
AND   tab1.col3=val3

查询2:

select tab1.col1
WHERE tab1.col2=val1
AND   tab1.col2=val2

我试过了 查询3:

select tab1.col1
WHERE tab1.col2=val1
AND   tab1.col2=val2
CASE WHEN  val3 <> ''
THEN tab1.col2=val3
ELSE ' '
END

但是 case 语句的语法不能处理表达式

【问题讨论】:

  • 我刚刚注意到您的查询中可能有错字,您有 where 'tab1.col2=val1 and tab1.col2=val2',这是您想要的吗?实现这一点的唯一方法是如果 'val1 = val2'
  • val3 是 ACE 变量还是如何设置的? John Boker 的回答(使用 OR 子句)似乎合乎逻辑,但如果 val3 是一个 ACE 变量,它可能会使事情复杂化——我不记得您是否可以直接测试这样的 ACE 变量。

标签: sql informix


【解决方案1】:

所以本质上你想要 tab1.col3 在提供时 = to val3 否则你希望 tab1.col3 等于它自己;所以不影响结果。但是,如果 tab1.col3 为空; null 等式不起作用,因此我们必须将 tab1.col3 设置为某个值才能使等式起作用。

SELECT  tab1.col1
WHERE tab1.col2=val1
  AND tab1.col2=val2
  AND coalesce(tab1.col3,-1) =  case val3 when null then coalesce(tab1.col3,-1) else val3 end 

【讨论】:

    【解决方案2】:

    也许像

    select tab1.col1
    WHERE tab1.col2=val1
    AND   tab1.col2=val2
    AND   (tab1.col3=val3 or val3 is null)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多