带有用户输入的IIF中的SQL WHERE

时间:2016-09-15 19:45:57

标签: sql ms-access user-input iif

我希望将用户输入提示的单独查询组合到一个查询中。

Q1提示用户输入9位数的ITEM(PN):

SELECT 
STUFF,
MORE_STUFF
FROM dbo_X
WHERE (RIGHT(dbo_X.ITEM, 9)=[PN:])
ORDER BY dbo_X.COMPONENT

Q2提示用户输入ItemDesc的一些部分(描述):

SELECT 
STUFF,
MORE_STUFF
FROM dbo_X
WHERE dbo_x.ItemDesc LIKE '*'&[Description:]&'*'
ORDER BY dbo_X.COMPONENT

我的想法是使用IIf根据用户输入执行单个WHERE语句:

SELECT 
STUFF,
MORE_STUFF
FROM dbo_X
IIf ([Description{D}PartNumber{P}:]='D',
    WHERE dbo_X.ItemDesc LIKE '*'&[Desc:]&'*',
    WHERE (RIGHT(dbo_X.ITEM, 9)=[PN:]))
ORDER BY dbo_X.COMPONENT

目前无法使用,也不确定我是否有语法问题,或者我是否尝试使用IIf /不正确。

2 个答案:

答案 0 :(得分:1)

考虑调整工作流程并使用专用用户界面,例如MS Access表单,而不是依赖于查询参数弹出窗口,这些弹出窗口在最佳设计中不是接收命名参数值的标准方式。

  1. 描述(D),PartNumber(P) Desc: PIN:可以通过第一个框有条件地链接(锁定/不可见)的字符长度验证的值。

  2. 保存指向表单控件的两个查询:

    SELECT 
    STUFF,
    MORE_STUFF
    FROM dbo_X
    WHERE (RIGHT(dbo_X.ITEM, 9)=Forms!myform![PN:])
    ORDER BY dbo_X.COMPONENT
    
    SELECT 
    STUFF,
    MORE_STUFF
    FROM dbo_X        
    WHERE dbo_x.ItemDesc LIKE '*'& Forms!myform![Description:] &'*'
    ORDER BY dbo_X.COMPONENT
    
  3. 在同一个新表单上,放置一个命令按钮来输出查询,并通过VBA或宏使该按钮调用相应的查询,具体取决于 Description(D),PartNumber(P)。使用这种方法,不会出现弹出窗口,因为所有参数都在表单上得到满足。

       
    If Forms!myform![Description(D), PartNumber(P)] = 'D' Then
        DoCmd.OpenQuery "DescriptionQuery"
    Else
        DoCmd.OpenQuery "PinQuery"
    End If
    

答案 1 :(得分:0)

iif()是一个表达式,而不是一个子句。所以,你不能那样使用它。

另一方面,你可以这样做:

SELECT STUFF, MORE_STUFF
FROM dbo_X
WHERE ([Description{D}PartNumber{P}:] = 'D' AND dbo_X.ItemDesc LIKE '*'&[Desc:]&'*') OR
      ([Description{D}PartNumber{P}:] <> 'D' AND RIGHT(dbo_X.ITEM, 9) = [PN:]))
ORDER BY dbo_X.COMPONENT;

哦,这甚至不需要iif()

顺便说一下,如果[Description{D}PartNumber{P}:]可以有NULL值(只需使用nz()函数),表达式会更复杂。