【问题标题】:Search a group of substrings from string and display all the records从字符串中搜索一组子字符串并显示所有记录
【发布时间】:2015-08-15 01:09:02
【问题描述】:

我正在使用 Oracle 11g。

我将多个值存储在由分隔符 (#@#) 分隔的列中。我知道这是错误的数据库设计,但由于它已使用多年,我对此无能为力。 我需要执行搜索操作,在其中传递多个值,如果存储值中的任何一个值匹配,我应该获取所有记录。我阅读了有关此类场景的正则表达式。 有人可以指导我如何进行吗?提前致谢。

谢谢

【问题讨论】:

  • 你能给我们一些示例数据和表格布局吗?如果可以的话,我希望你能把它放在sqlfiddle.com
  • 在 MSSQL 中,如果我知道可能的搜索词的最大数量,我将使用 WHERE (Col LIKE '%#@#'+SearchTerm1 +'#@#%' OR SearchTerm1 Is NULL) AND (Col LIKE '%#@#'+SearchTerm2 +'#@#%' OR SearchTerm2 Is NULL)... .. 对于未知数量的搜索词,然后我将填充一个临时表并加入它.. SELECT * FROM YourTable AS A INNER JOIN #STerms AS B on A.Col LIKE '%#@#'+B.STerm+'#@#%' ..
  • 请注意,我的回答是对您如何使用分隔符进行假设。例如如果您在只有一个值时不使用分隔符,那么您需要考虑如何处理各种场景,因为根据您在其中存储的值,它们都有自己的弱点。
  • sqlfiddle.com/#!9/9273b/1/0 请参考此链接...我期待所有 Portfolio1 所在的记录。
  • 也许我不明白你在做什么,但你不能用like来查询吗?从项目组合中选择 *,例如 '%Portfolio1%'

标签: sql plsql many-to-many plsqldeveloper


【解决方案1】:

修改this:

WITH tab AS (SELECT 'ab#@#bc#@#cd#@#de#@#ef' col FROM DUAL)
SELECT subcol
  FROM (    SELECT REGEXP_SUBSTR (col,
                                  '[^#@#]+',
                                  1,
                                  LEVEL)
                      subcol
              FROM tab
        CONNECT BY REGEXP_SUBSTR (col,
                                  '[^#@#]+',
                                  1,
                                  LEVEL)
                      IS NOT NULL)
 WHERE REGEXP_LIKE (subcol, 'c|d');

内部选择构建了一个由#@# 分隔的所有值的表。在您的应用程序中,您使用“|”构建搜索词列表作为分隔符并传递它,例如。比如bind variable。

【讨论】:

  • 我在表中添加了几行进行测试。我不确定我是否以正确的方式搜索。请看一下这个 sqlfiddle 演示:sqlfiddle.com/#!4/a27058/2
  • 我在sqlfiddle.com/#!4/73094/10 制作了一个新版本。添加了一个 distinct 和一个 lower() 来满足您的需求。但是,如果您在生产中需要它,则必须对其进行彻底测试。
猜你喜欢
  • 2017-07-04
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多