【问题标题】:Single quotation inside string in sqlsql中字符串内的单引号
【发布时间】:2014-09-21 13:41:22
【问题描述】:

我有以下用于搜索的 SQL 查询。

有一个@st 变量,它被分配了一个SQL 查询,最后我将执行该查询。问题是@st 变量被分配了一个字符串(即查询),并且在字符串内部有LIKE 表达式,例如:

address like '%edmon%'

这样就变成了:

set @st='select * from infoone where address like '%edmon%''

这会导致错误:

edmon 附近的语法不正确

完整的查询如下,

declare @v int;
declare @st varchar(1000);

set @st = 'select PLACEID, LEFT(CONVERT(NVARCHAR(1000), description), 500) as
des1, LOCATIONCITY, ADDRESS, DateT, RENT from infoone where '; 

Select @v = count(address) 
from infoone  
where ((address like '%main%') OR (address like '%main street%') 
       OR (address like '%main street edmonton%'));

if @v>0 
begin 
    set @st = @st + '(address like '%main%') OR 
                     (address like '%main street%') OR 
                     (address like '%main street edmonton%')' + 
                    'and ('; 
end 
else begin
    execute(@st)

请告诉我我做错了什么以及如何解决它

谢谢

【问题讨论】:

  • 任何匹配LIKE '%main%' 的东西也将匹配LIKE '%main street%'LIKE '%main street edmonton%' - 那么为什么不直接说LIKE '%main%' 呢?
  • 另外,计数是一个糟糕的主意——这意味着 SQL Server 必须对所有匹配的行进行计数。由于您只关心是否至少有一行,因此请像 M.Ali 的回答那样使用 EXISTS。

标签: sql sql-server-2008 tsql sql-server-2012 sql-like


【解决方案1】:

要获取字符串的单引号,请使用''

set @st = 'select * from infoone where address like ''%edmon%'''

【讨论】:

    【解决方案2】:

    Gordon Linoff 已向您解释了您的单引号 ' 哪里出了问题,但您的声明也存在一些其他问题。做你想做的事情的更好方法是这样的......

    declare @st nvarchar(MAX);
    
    set @st=N' select PLACEID
                    ,CONVERT(NVARCHAR(500),[description]) as des1
                    ,LOCATIONCITY
                    ,[ADDRESS]
                    ,DateT
                    ,RENT 
             from infoone  where 1 = 1 '; 
    
    IF EXISTS (Select * from infoone  
                    where(([ADDRESS] like '%main%') 
                       OR ([ADDRESS] like '%main street%') 
                       OR ([ADDRESS] like '%main street edmonton%')))
     begin 
       set @st = @st+ N' AND (
                           ([ADDRESS] like ''%main%'') 
                           OR
                           ([ADDRESS] like ''%main street%'') 
                           OR
                           ([ADDRESS] like ''%main street edmonton%'')
                          )'; 
     end 
    else 
      begin
        set @st = @st+ N' AND  (Some Other Condition) )'
      end
    
    EXECUTE sp_executesql @st
    

    【讨论】:

    • 我同意 EXISTS 比 COUNT 好,但我真的觉得这一步没有必要。事实上,这似乎有点令人困惑——如果表中有一个包含 main 的地址,那么添加这个 where 子句并将其限制为那些行,否则返回所有内容?三个 OR 也是多余的。如果有任何匹配 %main% 他们也将匹配 %main street% 和 %main street edmonton%。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多