设置:Microsoft Access 2010(目前没有其他可能),项目表包含projectName
(文本)和statusID
(整数)和generationID
(整数)的列在其他人中。整数列引用它们各自的表,我可以在其中检索它们的短名称和长名称。
目标:
我/用户可以在列表框中选择某一代名称的表单,然后表单将显示所选项目的所有项目。在现实生活中,这有点复杂,因为当然还有一些列。 ; - )
过滤值后,我需要创建报告,然后将其导出为PDF
使用子表单和过滤表,LibreOffice Base实现了目标(表单,报告所有内容)。我有SQL查询的工作代码,它完成了所有工作。但是ooBase它是不可能的。
SELECT "ftse"."stateTextShort", "ftgn"."genName", IFNULL( "p"."projGen", 9999 ) AS "pGn",
FROM "01_Projects" AS "p", "filterTable" AS "fT"
LEFT OUTER JOIN "10_State" AS "s" ON "p"."projState" = "s"."stateID"
LEFT OUTER JOIN "20_Generation" AS "g" ON "p"."projGen" = "g"."genID"
LEFT OUTER JOIN "10_State" AS "ftse" ON "fT"."filterState" = "ftse"."stateID"
LEFT OUTER JOIN "20_Generation" AS "ftgn" ON "fT"."filterGen" = "ftgn"."genID"
WHERE "pIx" = IFNULL( ( SELECT "filterProjIndex" FROM "filterTable" ), "pIx" )
AND "pSe" = IFNULL( ( SELECT "filterState" FROM "filterTable" ), "pSe" )
ORDER BY "p"."projName" ASC
我希望我没有使用该SQL语句生成完整的垃圾,因为它的时间要长得多,并且包含更多的列。
问题:
IFNULL
或COALESCE
。如何忽略没有值的过滤器?[打破格式化。我是个新手并且不知道更好]
SELECT ps.prjNameIntern, ss.stateShort, gn.genShort
FROM 001_projects AS ps
LEFT JOIN 010_status AS ss ON ps.prjStateID = ss.stateID
LEFT JOIN 020_generation AS gn ON ps.prjGenID = gn.genID
WHERE ps.prjStateID=(SELECT [ft].[fltrState] FROM [999_filterTable] AS ft)
但是使用两个JOIN语句它不起作用。一旦我遗漏了第二个或第一个和相应的列,它就可以正常工作。的解决
很多问号......
更新:
好的,我现在有多个JOIN
语句正常工作。我偶然发现了草案和SQL-View的不同之处,并且不理解Access的括号样式。
仍然存在的问题是如何在不使用VBA的情况下直接在SQL中解决IFNULL
和COALESCE
的缺失。
我尝试使用以下代码来测试CASE
或IIF
SELECT fr.fltrState, fr.fltrPltf,
CASE WHEN fr.fltrPltf = 0 THEN 9999 ELSE fr.fltrPltf END
FROM 999_filterTable AS fr
但我只是给了我:Syntaxerror (missing operator) in statement...
我现在有
SELECT
IIF(fr.fltrState=0, 9999, fr.fltrState) AS IIFState,
IIF(fr.fltrGen=NULL, 9999, fr.fltrGen) AS IIFGen
FROM 999_filterTable AS fr
返回fltrState
的值,但如果列为空,则不返回9999。
答案 0 :(得分:0)
你快到了:
SELECT IIF(fr.fltrState=0 or fr.fltrState IS NULL, 9999, fr.fltrState) AS IIFState,
IIF(fr.fltrGen IS NULL, 9999, fr.fltrGen) AS IIFGen
FROM 999_filterTable AS fr