【问题标题】:Compare exact string in oracle sql比较oracle sql中的确切字符串
【发布时间】:2019-09-18 14:22:45
【问题描述】:

我有一列用“:”冒号分隔不同的值。我想匹配列中的确切字符串。 让我们假设表是临时的,列名是 sample_col。值的顺序也可以改变。

sr_no|sample_col

1 |    'Sample-ABC'
2 |   'Sample-ABC-123'
3 |    'Sample-ABC-123:XYZ'
4 |    'Sample-ABC-123:Sample-ABC'
5 |    'XYZ:Sample-ABC'

所以

1) 需要查询来搜索值为“Sample-ABC”的记录,然后是 3 条记录(即 sr_no 1,4,5) 应该通过查询来实现

2) 需要查询来搜索值为“Sample-ABC-123”的记录,然后是 3 条记录(即 sr_no 2,3,4) 应该获取。

3) 对于那些具有“Sample-ABC-123”值但没有“Sample-ABC”的记录需要解决方案,然后应该获取 2 条记录(即 sr_no 2,3)。

我尝试使用 regexp_like、instr、like 等选项获取输出,但失败了。谁能帮我整理一下。

下面是我尝试获取具有“Sample-ABC”记录的 sql 查询:

select * from temp
where instr(sample_col,'Sample-ABC') > 1
and sample_col not like '%Sample-ABC-123%'; --this exclude 'Sample-ABC-123:Sample-ABC' record from

select * from temp
where sample_col not like '%Sample-ABC%'; --this will include 'Sample-ABC-123' records as well.


select * from temp
where regexp_like(sample_col,'Sample-ABC'); --this will include 'Sample-ABC-123' records as well.

我需要查询,它将提供所有的输出

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可能已经知道这是一种糟糕的数据格式,您应该使用更合适的结构来存储多个值,例如表、嵌套表、JSON、XML 或其他。

    也就是说,您可以通过为比较添加分隔符来做您想做的事情:

    where ':' || sample_col || ':' like '%:Sample-ABC:%'
    

    这将找到完全匹配。

    【讨论】:

    • 同意这个解决方案,但是值是通过前端插入的,并且它的存储冒号是分开的,所以如果最后插入的搜索字符串则不会有冒号。
    • @harshkumarsatapara 。 . .我不明白我们的评论。这就是你想要的。
    • 我的意思是,这将适用于 1 & 2 但不适用于 3rd
    • @harshkumarsatapara 。 . .当然不是。为此,您需要进行两次比较。但想法是完全一样的。一种是寻找' 'Sample-ABC-123',另一种是寻找'Sample-ABC-123'
    猜你喜欢
    • 2015-06-17
    • 2015-11-19
    • 2017-11-13
    • 1970-01-01
    • 2011-11-09
    • 2010-09-28
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多