2013-01-12 31 views
2

我有这个疑问:SQL SELECT只喜欢特定的词

SELECT * FROM mytable 
WHERE column1 LIKE '%word1%' 
AND column1 LIKE '%word2%' 
AND column1 LIKE '%word3%' 

我需要修改该查询返回的这列1包含字词1字词2和WORD3,没有别的记录!没有其他的话,只是这些话。

例如:搜索samsung galaxy s3应返回samsung s3 galaxy任意组合,但不samsung galaxy s3 lte

+0

你可以在这部分阐述,请'”其中column1包含word1 word2和word3,没有别的!“' –

+0

现在我得到的结果是Column1包含多于这3个单词,如'word1 word2 word3 word4',我需要的结果与在LIKE子句中准确指定单词,但以任何顺序。 –

+0

目前,您可以匹配单词的部分以及整个单词。你想匹配“word1word3word2”还是“word3 word2 word1”? –

回答

3

假设column1包含空格分隔的单词,而你只想要匹配单词,类似于:

SELECT * FROM 
    (select ' ' + REPLACE(column1,' ',' ') + ' ' as column1 from mytable) t 
WHERE 
    column1 like '% word1 %' AND 
    column1 like '% word2 %' AND 
    column1 like '% word3 %' AND 
    REPLACE(REPLACE(REPLACE(column1, 
     ' word1 ',''), 
     ' word2 ',''), 
     ' word3 ','') = '' 

请注意,这种结构确实允许相同的字多次出现。从这个问题是否应该允许这个问题不明确。 (Fiddle


这将是一个更好的设计,如果这些单词存储为在其涉及回mytable一个单独的表的不同行中。然后我们可以使用更普通的SQL来满足这个查询。你的例子看起来像是某种标记示例。有一个表格将每个标签存储为一个单独的行(如果需要,还会记录序号位置)会将其转化为简单的关系分割问题。


算一个字有多少次出现在一列的方式是表达:

(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word') 

但这将再次恢复到匹配的大词,以及这个词本身的子序列,没有更多的工作。

+0

的示例此查询返回的结果仅包含word1和word2 –

+0

@MarioM - 我更新了查询,因为我意识到它没有执行“所有这些单词”部分。 –

+0

现在效果更好,但它也返回不包含word3的记录 –

0

尝试这个

SELECT * FROM mytable 
WHERE column1 LIKE 'word1' 
AND column1 LIKE 'word2' 
AND column1 LIKE 'word3' 
+1

没有通配符和不同的表达式,这两个'LIKE'都不会是真的,所以结果总是一个空集。 –

+1

使用此查询,我得到的结果只包含一个单词,我需要结果以任意顺序返回包含所有3个单词的字符串 –

+1

请参阅我已添加到问题 –

0

MySQL你可以使用正则表达式作为

SELECT * FROM mytable 
WHERE column1 regexp '^word[1-3]$'; 

postgres你可以使用“similar to”关键字

我认为甲骨文也有regexp

+0

这是否在SQLite和MS SQL 2008中工作? –

+0

我不知道SQLite,但我认为它可以在MS SQL上工作,您只需尝试一下示例数据 – vidyadhar