在sqlite数据库中搜索符号

时间:2013-02-12 06:07:39

标签: sqlite select escaping

我需要在字段内容sqlite数据库中搜索这些! @ # $ % ^ & * ( ) '\符号,我使用以下sql字符串

Select ID From Tasks Where '--' || tasks || '--' ||  note || '--'  like '%! @ # $ % ^ & * ( ) ""%' 

或者我试过这个

Select ID From Tasks Where task LIKE '[!] [@] [#] [$] [%] [^] [&] [*] [(] [)] ''%'

但搜索不会返回任何结果。对于字段task,部分内容为

  1. Today's tasks

  2. here are some wildcards ! @ # $ % ^ & * ( ) '

  3. Some brakest are [ ] { } ( )

  4. 所以如果我作为一个整体搜索第一项,我应该得到它,或者如果我搜索! @ # $ % ^ & * ( ) ',我应该得到第2项。等等

    如果我在字段中传递文本中的一些通配符或者所有通配符都是相同的顺序,我应该得到包含值的行

    我知道一些符号在sqlite sql中有意义,所以如何在sql查询字符串中转义所有或任何这些字符

2 个答案:

答案 0 :(得分:1)

我会用这个:

Select ID From Contacts Where (email || mobile || main || other) GLOB '*[!@#$%^&*()\]*'

答案 1 :(得分:1)

首先,SQL中的字符串用单引号括起来;如果你想写一个包含单引号的字符串,你必须通过加倍它们来逃避它们:

SELECT ID FROM Tasks WHERE task = 'Today''s tasks'

为避免这种情况,大多数语言允许您使用参数:

db.execute("SELECT ID FROM Tasks WHERE task = ?", [ "Today's tasks" ])

其次,LIKE运算符专门解释%_字符。 要使用这些字符而没有其特殊含义,您可以使用ESCAPE clause指定一个逃脱%_及其自身的字符:

SELECT ID FROM Tasks WHERE task LIKE '%! @@ # $ @% ^ & * ( ) ''%' ESCAPE '@'

这个转义完全独立于SQL字符串引用;即使你使用参数,你仍然必须使用:

db.execute("SELECT ID FROM Tasks WHERE task LIKE ? ESCAPE '@'",
           [ "%! @@ # $ @% ^ & * ( ) '%" ])

第三,GLOB运算符没有特殊的转义字符; 你从字面上使用特殊字符,你必须以特殊的方式使用它们。 来自文档:

  

全球规则:

     
      
  • '*'匹配零个或多个字符的任何序列。
  •   
  • '?'只匹配一个字符。
  •   
  • [...]匹配随附的字符列表中的一个字符。
  •   
  • [^...]匹配不在随附列表中的一个字符。
  •   
     

[...][^...]匹配,可以包含']'个字符   在列表中,将其设为'[''^'之后的第一个字符。一个   可以使用'-'指定字符范围。例:   "[a-z]"匹配任何单个小写字母。要匹配'-',请制作   它是列表中的最后一个字符。

     

提示:要匹配'*''?',请将它们放入"[]"。像这样:

     

abc[*]xyz仅匹配"abc*xyz"