SQL搜索页面查询

埃里克·埃尔格(Eric Elguea)

我正在为在线数据库课程设计一个小项目,我想知道您是否可以解决我遇到的问题。

我有一个网页,该网页正在搜索电影数据库并使用电影初始输入字段,数字输入字段和代码字段检索特定列。这些都将转换为字符串,并用作查询的用户输入。

以下是我之前尝试过的方法:

select A.CD, A.INIT, A.NBR, A.STN, A.ST, A.CRET_ID, A.CMNT, A.DT
from MOVIE_ONE A
where A.INIT = :init 
AND A.CD = :cd
AND A.NBR = :num

页面必须搜索的方式在以下三种情况下:

  1. (首字母和数字)
  2. (码)
  3. (首字母,数字和代码)

案例必须是独立的,因此如果某些字段为空,但满足某个案例,则搜索将继续进行。它也必须在一个查询中。我被困在如何执行案件上。

查询中的参数取自SQLJ文件中方法中的Java参数。

如果您能为我如何解决这个问题提供帮助,我将不胜感激!

完善

考虑将等式表达式包装在中NVL与等同COALESCE),因此,如果参数输入为空白,则会根据自身检查相应的列。另外,请确保消除abc表别名的习惯

SELECT m.CD, m.INIT, m.NBR, m.STN, m.ST, m.CRET_ID, m.CMNT, m.DT
FROM MOVIE_ONE m
WHERE m.INIT = NVL(:init, m.INIT)
AND m.CD = NVL(:cd, m.CD)
AND m.NBR = COALESCE(:num, m.NBR)

为了说明这一点,请在下面的DB2小提琴中考虑一下,可以通过调整所有在相同精确数据上运行的值CTE参数来检查每种情况。

  • 情况1

    WITH 
     i(init) AS (VALUES('db2')),
     c(cd) AS (VALUES(NULL)),
     n(num) AS (VALUES(53)),
     cte AS
      ...
    
  • 情况二

    WITH 
     i(init) AS (VALUES(NULL)),
     c(cd) AS (VALUES(2018)),
     n(num) AS (VALUES(NULL)),
     cte AS
      ...
    
  • 情况3

    WITH 
     i(init) AS (VALUES('db2')),
     c(cd) AS (VALUES(2018)),
     n(num) AS (VALUES(53)),
     cte AS
      ...
    

但是,请注意,由于数据的性质(即双精度和日期),小提琴会运行不同的SQL。但是查询确实反映了相同的概念,NVL双方都有匹配的表达式。

SELECT *
FROM cte, i, c, n
WHERE cte.mytype = NVL(i.init, cte.mytype)
AND YEAR(CAST(cte.mydate AS date)) = NVL(c.cd, YEAR(CAST(cte.mydate AS date)))
AND ROUND(cte.mynum, 0) = NVL(n.num, ROUND(cte.mynum, 0));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章