Sqlite 提供仅包含另一个表中的字符串的字符串选择

Sqlite 提供仅包含另一个表中的字符串的字符串选择,sqlite,android-sqlite,Sqlite,Android Sqlite,我很难编写正确的sqlite查询来实现以下目标 我有两张桌子:单词和发音 例如: 内容表文字: **wordName** ape base house step round hat hoot hot 内容表声音: **soundName** **soundActive** a 1 b 0 o 1 ou 0 u

我很难编写正确的sqlite查询来实现以下目标

我有两张桌子:单词和发音

例如: 内容表文字:

**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
u
o
不同。 因此,在这种情况下,结果应该是:
hat

我得出了以下结论:

选择words.wordName
从单词连接单词上的发音。单词名类似“%”| | sounds.soundName | |“%”
其中sounds.soundActive=1
按words.wordName分组;
但这也给了我一些声音不活跃的单词。只要它有一个活跃的声音,这个词就给出了

我尝试使用
words.wordName与“%”| |声音不一样。soundName | |“%”声音在哪里。soundActive=0按单词分组。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
这是一个相当棘手的问题。
我发现使用
'%'| | |声音。soundName | |'%'
给了我无效的结果,例如,
ape
b
连接。因为,在它的解释中,它被视为
运算符

因此,为了更可靠,我决定使用正则表达式。
请尝试查看以下内容:

选择words.wordName作为wName,选择avg(sounds.soundActive)作为allActive——其子字符串的soundActive值为'0'的单词的平均值将小于1
from words join sounds on words.wordName REGEXP sounds.soundName{1,}——这意味着特定的声音是否在wordName中至少出现一次
按单词分组。wordName
具有ALACTIVE=1;
SQLFiddle:

,如果用于SQLite环境(不含
REGEXP
)-根据OP的评论编辑-:

选择words.wordName作为wName,选择avg(sounds.soundActive)作为allActive
从单词连接单词上的发音。单词名类似“%”| | sounds.soundName | |“%”
按单词分组。wordName
具有ALACTIVE=1;

SQLFiddle:

为了解决“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'

SQLFIDLE:

可能重复。请查看如何确定
ou
是一个声音还是两个声音?也许我可以通过制作两个表来解决这个问题。所有字母1个,超过1个字母的声音1个。谢谢。但问题是,这在sqlite上不起作用,因为REGEXP不是sqlite中的函数,您确定吗?我提供了一个替代方案,在SQLite的数据库浏览器中,它不起作用。我还尝试了SQL fiddle链接,但也没有成功。也许我可以将它添加到SQLite的数据库浏览器中,但这不会使它在android mobileThanks上工作!成功了。我所要做的就是使用| |而不是concat,因为这也不是sqlite上的函数。其他发音(如ou)的问题仍然存在,但我现在已经走得更远了。我认为一个额外的表格,包含所有超过1个字母的发音就可以了。但我还是被卡住了。我尝试了“从单词中选择words.wordName、avg(sounds.soundActive)、avg(sounds2.soundActive)、avg(sounds.soundActive和sounds2.soundActive)”、sounds2(在单词上)和soundName(如“%”| | | sounds.soundActive)以及words.wordName(如“%”| | | | sounds2.soundName |‘%”按单词分组。具有avg(soundals.soundActive)=)=1和avg的单词名称((sounds.soundActive和sounds2.soundActive)“但很明显,这是行不通的。你知道吗?我认为找出一个单词的读音对SQL来说是一个太复杂的问题。例如,如果你有一个‘th’读音,那么你就会对‘author’和‘outhouse’这两个词产生问题。你可能已经对‘ou’有了问题,但我想不出一个词是从我的头顶上蹦出来的。”头在你们彼此后面有“你们”的地方,但它们应该被视为独立的声音。