我在编写正确的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
我想写一个查询,让我回复只包含有效声音的单词。注意ou
与o
与u
不同。
因此,在这种情况下,结果应为: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
结果应为house
,hat
,hot
答案 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