SQLite3 CASE和LIKE语句有困难

时间:2018-02-21 03:21:55

标签: php sqlite

我在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%'

1 个答案:

答案 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());