接受通配符的sql查询

接受通配符的sql查询,sql,oracle,plsql,Sql,Oracle,Plsql,我的要求是接受通配符并显示记录。 以下是通配符条件: %=0到多个字符 \=1个字符 下面是我的SQL查询: labelSerialNumber和productSerialNumber将接受通配符(%and_),并应相应地显示记录 where (:productSerialNumber is null or pd_res.product_serial_number = :productSerialNumber) like '%_%' and (:labelSerialNumber

我的要求是接受通配符并显示记录。 以下是通配符条件:

%=0到多个字符

\=1个字符

下面是我的SQL查询:

labelSerialNumber和productSerialNumber将接受通配符(%and_),并应相应地显示记录

where (:productSerialNumber is null or
    pd_res.product_serial_number =
    :productSerialNumber) like '%_%'
and (:labelSerialNumber is null or
    pd_res.label_serial_number = :labelSerialNumber)
and ('nullValue' = :formatDescFlag or
    TRIM(lf.format_id_desc) in (:formatDesc))   
and (:formatId is null or
    lf.format_id = :formatId)        
and (:fromDate is null or
    pd_res.created_timestamp >=
    to_date(:fromDate, 'mm/dd/yyyy'))
and (:todate is null or
    pd_res.created_timestamp <
    (to_date(:todate, 'mm/dd/yyyy') + 1))) ProductData_inner) ProductData)
在添加LIKE运算符后运行上述查询时,它抛出SQL异常,因为右括号丢失。请建议

--EDIT2--

productSerialNumber和labelSerialNumber是UI中两个不同的文本框,用户可以在其中输入值并搜索结果。 这些字段不是必填字段。用户可以只输入productSerialNumber,它将接受通配符(例如:%667%),也可以只输入labelSerialNumber,它将接受通配符,或者用户可以输入这两个字段,具体取决于其搜索条件

我可以按以下方式修改条件:

where ( (:productSerialNumber is null or
         pd_res.product_serial_number = :productSerialNumber)
       like '%_%'
       )
and ((:labelSerialNumber is null or 
      pd_res.label_serial_number = :labelSerialNumber)
      like '%_%')

我将忽略这段代码的全部可怕之处,而将重点放在您所说的引发异常的部分

我们不能指定这样的复合条件:

where (:productSerialNumber is null or
           pd_res.engine_serial_number =
                   :productSerialNumber) like '%_%'
我们需要用布尔运算符连接它们:

where ( (:productSerialNumber is null or
         pd_res.engine_serial_number = :productSerialNumber)
       and coalesce(:productSerialNumber, pd_res.engine_serial_number )  like '%_%'
       )
请注意,
类似“%”
相当于
不为空。如果要显式测试序列号是否包含下划线,则此测试会更好:

instr(coalesce(:productSerialNumber, pd_res.engine_serial_number ), '_') > 0
虽然读了这篇评论

“如何修改上述查询以接受的通配符(%,\) productSerialNumber/labelSerialNumber“

。。。看来你想要的其实是

 pd_res.engine_serial_number like
                 coalesce(:productSerialNumber, pd_res.engine_serial_number )
使用此公式,如果绑定变量
:productSerialNumber
为空,则比较将折叠为
pd\u res.engine\u serial\u number,如pd\u res.engine\u serial\u number
,这始终为真;如果
:productSerialNumber
填充了一个精确的值,它将解析为
:productSerialNumber=pd_res.engine_serial_number
;如果用部分值和通配符填充
:productSerialNumber
,它将解析为
:productSerialNumber,如pd_res.engine_serial_number


务必使用相同的技术测试
:labelSerialNumber
和您喜欢的任何其他参数。

请解释“输出不符合预期”的含义。给我们一些示例原始数据,给定参数的输出和所需的输出。你提供的细节越多,你就越有可能得到一个有用的答案。另外,您是否真的想将此问题标记为[oracle]和[sql server]?此外,您在发布查询时似乎截断了查询here@APC,当我使用like关键字在CASE中接受通配符时,它在关键字“when”附近显示了不正确的语法。这是我唯一需要标记的oracle。Thanks@APC,请查看编辑后的帖子,添加完整查询。请建议我如何修改上述查询,以接受productSerialNumber/labelSerialNumber的通配符(%,\)。谢谢。你在同一个班吗?谢谢,请看——EDIT2——在我上面的帖子中,这样行吗?prodctSerialNumber和labelSerialNumber是从前端获取输入的两个不同的独立列。您的EDIT2只是EDIT1的一个版本,我已经说过它不会按您希望的方式工作。
 pd_res.engine_serial_number like
                 coalesce(:productSerialNumber, pd_res.engine_serial_number )