2016-09-26 77 views
1

我需要编写一个单独的SQL语句来列出所有包含精确单词'right'(包括大写和小写)作为名为Track的名称的一部分的单词。换句话说,它不会在输出中包含带有“权利”或“正义”字样的曲目名称。找到确切的单词作为字符串的一部分

我写了这个,但我不断地在字母前面或后面加上字母,例如:明亮或权利。

SELECT name 

FROM Track 

WHERE name LIKE "%right%"; 
+0

你需要做一个MATCH。首先你建立一个FTS表,然后做一个MATCH。要使用FTS表,您需要在SQLITE库中定义SQLITE_ENABLE_FTS3。 MATCH在全文中起作用,并且不区分大小写。 – BobRun

回答

2

LIKE用于模式匹配。 %的意思是“零个或多个任意字符”,如其他系统中的*通配符。 name LIKE "%right%"表示“名称”是“正确的”,前后都是“。这就是为什么你得到“更明亮”和“权利”。

用正则表达式可以写出类似于/\bright\b/的地方,其中\b表示“单词分隔符”。但SQLite需要一个插件来使用正则表达式,LIKE没有相应的东西。所有你必须使用的是%(零个或多个字符)或_(任何一个字符)。最好你可以做的是匹配空格,如LIKE "% right %",但只有在“右”周围有空格时才有效。 “现在”不匹配。

如果你想从“右”,“右转”和“左转左转”等数值中选择“right”这个词,你需要覆盖四种可能性。

  • 它在一开始。
  • 它在最后。
  • 它在中间。
  • 独自一人。

这意味着四个表达式。

name LIKE "right %" or 
name LIKE "% right" or 
name LIKE "% right %" or 
lower(name) = "right" 

LIKE在SQLite中默认是不区分大小写的。 =不是,因此需要lower(name)将值归一化为小写。

+0

我不认为他在寻求平等。如果名称字段包含“RIGHT MAN”,那么他希望该名称在输出中。但根据你的答案,不会给出正确的输出? –

+0

谢谢= =似乎只给我什么,因为没有轨道标题只有正确的。我在发布之前尝试过并获得了它。我需要用其他词汇来表达它,但是在没有任何字母之前或之后的标准......这是否有意义Schwern? –

+0

@DeendayalGarg这确实更有意义!我已经更新了我的答案。 – Schwern

相关问题