接受通配符的sql查询
Posted
技术标签:
【中文标题】接受通配符的sql查询【英文标题】:sql query to accept wild card characters 【发布时间】:2015-09-01 00:19:46 【问题描述】:我的要求是接受通配符并显示记录。 下面是通配符条件:
% = 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 子句中添加了 LIKE 运算符,以便 productSerialNumber 接受通配符,如下所示:
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 '%_%')
【问题讨论】:
请解释您所说的“输出不符合预期”是什么意思。给我们一些样本原始数据,给定参数的输出和你想要的输出。您提供的详细信息越多,您获得有用答案的可能性就越大。另外,您真的要标记这个问题 [oracle] and [sql-server] 吗? 另外,您在此处发布查询时似乎截断了查询 @APC ,当我在 CASE 中使用 like 关键字接受通配符时,它在关键字“WHEN”附近显示不正确的语法。它是我唯一需要标记的神谕。谢谢 @APC ,请查看编辑后的帖子,添加完整查询。请建议我如何修改上述查询以接受 productSerialNumber/labelSerialNumber 的通配符(%、_)。谢谢。 你们同班吗? ***.com/questions/32322380/… 【参考方案1】:我将忽略这段代码的全部恐怖之处,并专注于您所说的引发异常的部分。
我们不能像这样指定复合条件:
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 '%_%'
)
注意like '%_%'
等同于is not null
。如果你想明确测试序列号是否包含下划线,那么这个测试会更好:
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_res.engine_serial_number like pd_res.engine_serial_number
,这始终是正确的;如果:productSerialNumber
填充了一个精确值,它将解析为:productSerialNumber=pd_res.engine_serial_number
;如果:productSerialNumber
填充了部分值和通配符,它将解析为:productSerialNumber like pd_res.engine_serial_number
。
请务必使用相同的技术来测试:labelSerialNumber
和您喜欢的任何其他参数。
【讨论】:
谢谢,请参阅我上面的帖子中的--EDIT2--,这样可以吗? prodctSerialNumber 和 labelSerialNumber 是两个不同的独立列,从前端获取输入。 您的 EDIT2 只是 EDIT1 的一个版本,我已经说过不会按您希望的方式工作。以上是关于接受通配符的sql查询的主要内容,如果未能解决你的问题,请参考以下文章