oracle 带一个空参数的SQL查询?

x7rlezfr  于 2023-08-03  发布在  Oracle
关注(0)|答案(3)|浏览(124)

我已经为Excel Power Query编写了一个SQL脚本,该脚本从Oracle数据库中获取值。我的查询由命名的excel单元格组成,其中包括日期范围,“产品”和“分析”,当输入所有这些参数时,它可以完美地工作。
有些情况下,如果“分析”字段留空,我想返回某个“产品”在某个日期范围内的所有结果。一般来说,如果参数字段为空,则返回数据库条目的所有行,而不是特定行。
由于数据库中数据的性质,我不得不使用Text.From来获取查询,以识别来自命名单元格的搜索参数。但是,这会产生空单元格“Expression.Error:我们无法将null值转换为Text类型。”
我可能应该补充一下,SQL对我来说仍然是一个全新的世界。
现在,如果我从脚本中完全删除参数(between these),它将按预期工作。这给了我一个想法,如果命名的单元格为空,可以使用if-then else语句使整个参数“消失”。但是语法有问题,它仍然给我“Expression.Error:我们无法将null值转换为Text类型。”
先谢了

analysis = Excel.CurrentWorkbook () {[Name="analysis"]}[Content]{0}[Column1],
    product = Excel.CurrentWorkbook () {[Name="product"]}[Content]{0}[Column1],
    startdate = Excel.CurrentWorkbook () {[Name="startdate"]}[Content]{0}[Column1],
    enddate = Excel.CurrentWorkbook () {[Name="enddate"]}[Content]{0}[Column1],
    sqlstartdate = Date.From(startdate),
    sqlenddate = Date.From(enddate),    
    Source = Odbc.Query("dsn=xxdatabase", "SELECT S_SAMPLE.COLLECTIONDT , S_SAMPLE.S_SAMPLEID , S_SAMPLE.PRODUCTID , S_SAMPLE.U_CORNNR , S_SAMPLE.U_REACTORNR , S_SAMPLE.U_ADDITIONALINFO , S_SAMPLE.U_MATERIALNUMBER , SDIDATAITEM.PARAMID , SDIDATAITEM.DISPLAYVALUE , SDIDATAITEM.DISPLAYUNITS#(lf)#(lf)FROM xx.S_SAMPLE#(lf)#(lf)LEFT JOIN xx.SDIDATAITEM ON S_SAMPLE.S_SAMPLEID = SDIDATAITEM.KEYID1#(lf)#(lf)WHERE PRODUCTID='" &Text.From(product)& "' AND **if [analysis] = null then "" else [PARAMID='" &Text.From(analysis)& "']** AND COLLECTIONDT between TO_DATE('" &Text.From(sqlstartdate)& "','DD.MM.YYYY') AND TO_DATE('" &Text.From(sqlenddate)& "','DD.MM.YYYY')#(lf)")

字符串

esbemjvw

esbemjvw1#

如果你得到了
“表达式。错误:我们无法将null值转换为Text类型。”
然后将表达式 Package 为

= try Text.From(something) otherwise "something else"

字符串
但总的来说我觉得你在找这个

let x= "WHERE PRODUCTID='" &Text.From(product)& "' AND",
y=if [analysis] =null then "" else "[PARAMID='" &Text.From(analysis)& "']"
combinequery=x&y,
in combinequery

mznpcxlj

mznpcxlj2#

我不知道如何编写在Excel中工作的查询,所以我只是猜测,但希望你能用它做些什么。
这是您当前的where子句:

WHERE PRODUCTID='" &Text.From(product)& "'
  AND COLLECTIONDT between TO_DATE('" &Text.From(sqlstartdate)& "','DD.MM.YYYY') 
                       AND TO_DATE('" &Text.From(sqlenddate)& "','DD.MM.YYYY') 
  AND if   [analysis] = null then "" 
      else [PARAMID='" &Text.From(analysis)& "']

字符串
如果可能的话,将最后两行重写为如下内容:

AND ( [PARAMID='" &Text.From(analysis)& "']  or [analysis] = null)


再说一次:我不熟悉这种语法--方括号,部分括在双引号里等等。
顺便说一下,在Oracle中,nothing 等于null,所以我实际上使用IS NULL

AND ( [PARAMID='" &Text.From(analysis)& "']  or [analysis] IS null)
                                                           --
                                                          this

vbopmzt1

vbopmzt13#

我咨询了Bing一段时间,我们设计了以下工作解决方案:

paramidFilter = if analysis <> null and Text.Length(Text.From(analysis)) > 0 then " AND PARAMID='" & Text.From(analysis) & "'" else "",

字符串
如果analysis为空,则将that添加到定义中将忽略paramid。
感谢大家!

相关问题