sql查询接受通配符

时间:2015-09-01 00:19:46

标签: sql oracle plsql

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

%= 0到多个字符

_ = 1个字符

以下是我的SQL查询:

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

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)

请建议对上述查询进行哪些修改,以便在为productSerial number / labelSerialNumber指定通配符时显示匹配的记录。感谢。

- EDIT1 -

我希望上面的查询接受productSerialNumber / labelSerialNumberhave的通配符(%,_)。我在上述查询的WHERE子句中为productSerialNumber添加了LIKE运算符,以接受通配符,如下所示:

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

在添加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 '%_%')

1 个答案:

答案 0 :(得分:2)

我会忽略这段代码的全部恐怖,并专注于你说的抛出异常的位。

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

where ( (:productSerialNumber is null or
         pd_res.engine_serial_number = :productSerialNumber)
       and coalesce(:productSerialNumber, pd_res.engine_serial_number )  like '%_%'
       )

我们需要使用布尔运算符加入它们:

like '%_%'

请注意,is not null相当于instr(coalesce(:productSerialNumber, pd_res.engine_serial_number ), '_') > 0 。如果要显式测试序列号是否包含下划线,则此测试会更好:

 pd_res.engine_serial_number like
                 coalesce(:productSerialNumber, pd_res.engine_serial_number )

虽然已阅读此评论......

  

&#34;我如何修改上述查询以接受通配符(%,_)   productSerialNumber / labelSerialNumber&#34;

......似乎你想要的实际上是

:productSerialNumber

使用此公式,如果绑定变量pd_res.engine_serial_number like pd_res.engine_serial_number为null,则比较将折叠为:productSerialNumber,这始终为true;如果:productSerialNumber=pd_res.engine_serial_number填充了确切的值,则会解析为:productSerialNumber;如果:productSerialNumber like pd_res.engine_serial_number填充了部分值和通配符,则会解析为:labelSerialNumber

一定要使用相同的技术来测试{{1}}以及任何其他需要您参考的参数。