我正在为在线数据库课程设计一个小项目,我想知道您是否可以解决我遇到的问题。
我有一个网页,该网页正在搜索电影数据库并使用电影初始输入字段,数字输入字段和代码字段检索特定列。这些都将转换为字符串,并用作查询的用户输入。
以下是我之前尝试过的方法:
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
页面必须搜索的方式在以下三种情况下:
案例必须是独立的,因此如果某些字段为空,但满足某个案例,则搜索将继续进行。它也必须在一个查询中。我被困在如何执行案件上。
查询中的参数取自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参数来检查每种情况。
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
...
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] 删除。
我来说两句