【问题标题】:If no result then another query, can be combined to one query?如果没有结果那么另一个查询,可以合并到一个查询吗?
【发布时间】:2016-12-31 02:16:27
【问题描述】:
Phone_book
+----+---------+-----------+--------------+
| id | key     | code      |    value     |
+----+---------+-----------+--------------+
| 1  | MAX_VAL | 111       |    reset     |
+----+------+--------------+--------------+
| 2  | MIN_VAL | 222       |    set       |
+----+------+--------------+--------------+
| 3  | MIN_VAL | 0         |    NA        |
+----+---------+-----------+--------------+

键码组合为主键。

要求:

如果存在 KEY 和 CODE,则返回 VALUE。

如果 KEY 存在且 CODE 不存在,则返回 CODE 0 的值。

实施:

通过使用多个查询来实现这一点。使用的语法适用于 JPQL

1)"SELECT param FROM Phone_book param WHERE upper(key)=:paramKey AND code=:estCode";

如果返回 null,则执行另一个查询

2)"SELECT param FROM Phone_book param WHERE upper(key)=:paramKey AND code=:O";

我在寻找什么:

我可以通过一个查询或更好的方式实现这一点吗?

提前致谢。

【问题讨论】:

    标签: sql oracle jpql


    【解决方案1】:

    MySQL 相关,因为该问题最初被标记为 MySQL

    你可以试一试:

    SELECT 
    defaultTable.`key`,
    COALESCE(queryTable.`value`,defaultTable.`value`) AS v
    FROM
    (
        SELECT 
        `key`,
        `value`
        FROM Phone_book 
        WHERE UPPER(`key`) = ?
        AND `code` = 0
    ) AS defaultTable
    
    LEFT JOIN 
    (
        SELECT 
        `key`,
        `value`
        FROM Phone_book 
        WHERE UPPER(`key`) = ?
        AND `code` = ?
    ) AS queryTable
    ON defaultTable.`key` = queryTable.`key`;
    

    注意:用您提供的值替换问号。

    如果提供的keycode 值不存在任何记录,则queryTable.value 将为NULL

    所以COALESCE 将从defaulTable 中选择值(如果有)。

    【讨论】:

    • 这个查询是针对 Plsql 吗? DB 是 plsql。
    • 你的问题中有mysql标签,这是原始的mysql查询。
    • ok,添加错了,会尝试把这个转成plsql。
    【解决方案2】:

    在 Oracle SQL 中,以下内容足以满足您的需要。无需为此编写 PLSQL。

    SELECT key,
           nvl(code,0)                            -- This will make sure if code is null then value is 0
    FROM Phone_book  
    WHERE (key is not NULL AND CODE IS NOT NULL)  -- This will help in fetching value when KEY and CODE is present
    OR ( key is not null and code is null);       -- This will help in fetching value  when KEY is present and CODE is null. 
    

    【讨论】:

      【解决方案3】:
      select 
      case 
         when key is not null and code is not null then value
         when key is not null and code is null then 0
      end 
      from phone_book;
      

      【讨论】:

      • 看上面提到的表格列,正确回复。这行不通。
      【解决方案4】:
      select value from (
        select value, row_number() over (order by case when code = 0 then 2 else 1 end) rn
          from phonebook pb 
          where upper(key) = :paramKey and (code = :estCode or code = 0))
        where rn = 1
      

      选择具有请求键和请求代码或代码 0 的值。使用函数 row_number 对它们进行正确排序并取第一个值。

      【讨论】:

        猜你喜欢
        • 2014-08-18
        • 2011-02-17
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2014-11-25
        • 2015-03-16
        相关资源
        最近更新 更多