接受通配符的sql查询
我的要求是接受通配符并显示记录。 以下是通配符条件: %=0到多个字符 \=1个字符 下面是我的SQL查询: labelSerialNumber和productSerialNumber将接受通配符(%and_),并应相应地显示记录接受通配符的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
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 )