接受通配符的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查询的主要内容,如果未能解决你的问题,请参考以下文章

09 SQL语言——通配符(模糊查询),转义字符(使用escape)

SQL利用通配符进行模式查询

Sql Server中通配符

获取两个通配符 T-sql 查询语法之间的范围

sql like 通配符 模糊查询技巧及特殊字符

如何使用用户输入和通配符编写 sql 查询