给出一个只包含来自另一个表的字符串的字符串

时间:2014-10-28 11:13:13

标签: sqlite android-sqlite

我在编写正确的sqlite查询时遇到困难以实现以下目的。

我有2个表:单词和声音

例如: 内容表词:

**wordName**
ape
base
house
step
round
hat
hoot
hot

内容表声音:

**soundName** **soundActive**
     a               1
     b               0
     o               1
     ou              0
     u               1
     s               1
     h               1
     t               1
     e               0
     f               0
     p               1

我想写一个查询,让我回复只包含有效声音的单词。注意ouou不同。 因此,在这种情况下,结果应为:hat

我想出了以下内容:

select words.wordName
from words join sounds on words.wordName like '%'||sounds.soundName||'%'
where sounds.soundActive=1
group by words.wordName;

但是这也给了我那些声音不活跃的单词。只要它有一个有效的声音,就会给出这个词。

我尝试words.wordName not like '%'||sounds.soundName||'%' where sounds.soundActive=0 group by words.wordName对我来说似乎更合乎逻辑但是这回复了所有的话语。

更新:Yohanes Khosiawan第二个解决方案适用于sqlite。

select words.wordName as wName, avg(sounds.soundActive) as allActive
from words join sounds on words.wordName like '%'||sounds.soundName||'%'
group by words.wordName
having allActive=1;

但是为了得到一两个字母的声音,我会创建一个新表: 示例:内容表sounds2:

**sound2Name** **sound2Active**
au                    0
ou                    1
oo                    0

结果应为househathot

2 个答案:

答案 0 :(得分:1)

你有一个非常棘手的问题。
我发现使用'%'||sounds.soundName||'%'给了我无效的结果,例如,ape已加入b。因为在here中解释过它被视为or运算符。

因此,为了更可靠,我决定使用正则表达式 试着看看这个:

select words.wordName as wName, avg(sounds.soundActive) as allActive --words which its substring has `0` soundActive value will have average < 1 
from words join sounds on words.wordName REGEXP sounds.soundName{1,} --it means that whether a particular sound occurs at least once in the wordName
group by words.wordName
having allActive=1;

SQLFiddle:http://sqlfiddle.com/#!2/377f70/20

OR ,如果是针对SQLite环境(没有REGEXP) - 根据OP的评论编辑 - :

select words.wordName as wName, avg(sounds.soundActive) as allActive
from words join sounds on words.wordName like '%'||sounds.soundName||'%'
group by words.wordName
having allActive=1;

SQLFiddle:http://sqlfiddle.com/#!5/377f7/3

答案 1 :(得分:1)

为了解决'ou'匹配'ou','o'和'u'的问题,我会用声音表中的特殊字符替换'ou'。我用'$'。然后你可以在加入前用你的单词中的'$'替换'ou'。

我的SQL最终看起来像这样:

select words.wordName
from words join sounds 
where replace(words.wordName, 'ou', '$') like '%'||sounds.soundName||'%'
group by words.wordName
having min(soundActive) = '1'

SQLfiddle:http://sqlfiddle.com/#!2/57f72/11