【问题标题】:how to query some characters in one field?如何查询一个字段中的一些字符?
【发布时间】:2019-11-07 20:36:11
【问题描述】:

我的数据库是 Oracle 11g。

我想在 sql 中做一个 in 查询。查询条件是匹配某个字段的部分字符:

    description
    CWLV321900017391;EFHU3832239
    CWLV321900017491;ERHU3832239
    CWLV321900017591;ERHU3832239
    CWLV321900017691;ERHU3832239

我的查询是这样的:

select * from product where description in ('CWLV321900017391', 'CWLV321900017491'); 

结果中不返回任何记录。

我希望得到如下结果:

    description
    CWLV321900017391;EFHU3832239
    CWLV321900017491;ERHU3832239

如何通过SQL获取?

谢谢。

【问题讨论】:

  • 一个表有,而不是字段。还有,而不是记录。
  • 您不应该将逗号分隔的值存储在单个列中。一开始这是一个非常糟糕的主意

标签: sql string oracle


【解决方案1】:

您正在使用INdescription 表中搜索部分字符串匹配。这不会返回结果,因为IN 只会匹配精确值。

相反,实现此目的的一种方法是将LIKE 运算符与% 一起使用:

select  *
  from  product
  where (description LIKE 'CWLV321900017391%' OR
        description LIKE 'CWLV321900017491%'); 

末尾的%表示任何东西都可以跟在指定的文本之后。

这将返回任何description CWLV321900017391CWLV321900017491 开头。

顺便说一句,如果您的搜索词出现在描述字段中任何地方,则需要在搜索词的每一端使用%

description LIKE '%CWLV321900017391%' OR description LIKE '%CWLV321900017491%'

【讨论】:

    【解决方案2】:

    有多种解决方法。这是一个:

    select * from product 
    where instr (description, 'CWLV321900017391') > 0
    or    instr (description, 'CWLV321900017491') > 0;
    

    如果您知道自己一直在寻找 description 的开头,您可以使用:

    select * from product 
    where substr (description, 1, 16) in ('CWLV321900017391','CWLV321900017491')
    

    此外,还有 LIKE 或 REGEX_LIKE 解决方案。这实际上取决于您要搜索的字符串。


    当然,这些解决方案都不是真正令人满意的,而且对于大量数据可能会表现出糟糕的性能。问题是起始数据模型通过存储非原子值违反了First Normal Form。糟糕的数据模型会产生笨拙的 SQL。

    【讨论】:

      【解决方案3】:

      你可以试试下面的方法-

      select * from product 
      where substr(description,1,instr(description,';',1,1)-1) in ('CWLV321900017391', 'CWLV321900017491')
      

      【讨论】:

        【解决方案4】:

        我反对以分隔字符串格式存储多个值。有很多更好的选择,但让我假设您在数据模型上别无选择。

        如果您遇到这种格式的字符串,您应该考虑分隔符。您可以使用like

        where ';' || description || ';' like '%;CWLV321900017391;%'
        

        如果您想查找多个值之一,也可以使用 regexp_like() 执行类似的操作:

        where regexp_like(';' || description || ';',
                          '(;CWLV321900017391;)|(;CWLV321900017391;)'
                         )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多