【问题标题】:SQL Search using another Field as String Value使用另一个字段作为字符串值的 SQL 搜索
【发布时间】:2017-04-24 06:22:51
【问题描述】:

我有一个 SQL 查询的想法,但我不确定这是否可行。假设我有一个包含 3 列的表格:

IDNUMBER, PARAGRAPH, ANIMAL 
  • IDNUMBER 只是一个密钥标识符号。

  • PARAGRAPH 总是会有一大段文字,有时会在段落中提到动物。

  • ANIMAL 将始终设置一个小的值,例如“Dog”或“Monkey”。

对于每个IDNUMBER,有没有办法获取 Animal 列中的值并 使用该值对相应的Paragraph 列进行字符串搜索?我不确定是否需要将 Animal 值分配给每个循环的某种字符串变量?在这一点上,这更像是一个概念性问题,因为我不确定这在 SQL 中是否可行,但类似于:

SELECT
    idnumber, paragraph, animal
FROM 
    zootable
WHERE 
    paragraph NOT LIKE ('%currentAnimalValue%')

抱歉,这个太随意了,我只是想对这个进行一次健全性检查。感谢您提供的任何帮助/智慧! :)

【问题讨论】:

  • 你的 dbms 是什么?
  • 每个段落是否与表格中的动物有关?
  • 我主要在 Teradata 和 Oracle SQL Developer 工作,所以这两个都不错。
  • 我同意以下答案。我只是想补充一点,您需要小心使用通配符。例如,如果您的段落中包含单词pants,而动物是ants。
  • 我建议你改一下架构,一表动物,一表段落

标签: sql oracle teradata


【解决方案1】:

Gordon 的回答可能会产生一些不正确的匹配。

例如:'panda' like '%pandas%' 返回 True。 'ant' like '%pant%' 返回真

为避免这种情况,您应该使用 regexp(在 Oracle 中)来考虑单词边界(假设段落列是空格分隔的)。

对于匹配使用:

select * from t 
where regexp_like(paragraph,'(^|\s)'||animal||'(\s|$)')

对于不匹配使用

select * from t 
where not regexp_like(paragraph,'(^|\s)'||animal||'(\s|$)')

【讨论】:

    【解决方案2】:

    你的意思是这样的吗?

    select t.*
    from t
    where t.paragraph not like '%' || t.animal || '%' ;
    

    某些数据库使用concat()、+ 或& 进行字符串连接。

    【讨论】:

    • 我对你们破解它的速度感到惊讶!非常感谢,这已被添加到收藏夹库中!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2021-11-28
    • 2020-01-06
    • 2013-01-18
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多