我在sqlite3中有一个声明给我带来了一些麻烦。我部分理解为什么它不工作我只需要找出解决方案。我有一个包含标题的列。有些标题有“The”作为前缀。我想跳过'The'并抓住下一个相关角色。基本上我想用字母A获取所有结果。例如“The Abyss”。我想忽略'The'和空格,看看下一个字母是否与搜索相关。然而,并非所有标题都以“The”为前缀。这是我的sqlite3语句。我知道它不起作用,因为我只搜索列中的第一个字符,因此无法查看“The”是否存在。我怎样才能做到这一点?
SELECT *,CASE WHEN substr(MovieTitle,1,4) = 'The ' THEN
substr(MovieTitle,5) ELSE MovieTitle END FROM Movies WHERE MovieTitle LIKE 'a%'
答案 0 :(得分:3)
因此,如果我搜索' a'它应该带来深渊' The Abyss' ,用' c'它应该带来'The Croods'。您可以将CASE语句与WHERE结合使用以获得结果。还要注意我添加的lower()
函数,以便捕获单词“'”的所有变体。 - '' ''或者' THE'
SELECT * from movies WHERE
(
CASE WHEN lower( substr( MovieTitle,1,4) ) = 'the '
THEN
substr( MovieTitle,5)
ELSE MovieTitle END COLLATE NOCASE
) like 'C%'
COLLATE NOCASE
`COLLATE NOCASE` Above will catch all variations of the next word like 'Croods' - 'croods' or ' CroodS'
PHP
$sql = "SELECT * from movies WHERE
(
CASE WHEN lower( substr( MovieTitle,1,4) ) = 'the '
THEN
substr( MovieTitle,5)
ELSE MovieTitle END COLLATE NOCASE
) like :searchText
COLLATE NOCASE";
$db = new SQLite3('mydb.db');
$stmt = $db->prepare($sql);
$stmt->bindValue(':searchText', $keyword . '%' , SQLITE3_TEXT); //$keyword is user typed
$result = $stmt->execute();
var_dump($result->fetchArray());