0

我有一个类似的查询:

SELECT * 
FROM qAll 
WHERE name not in('Alina,Charaidew,Sukapha') 

这是行不通的。最好的方法是什么?由于此列表是动态生成的,并且可能每次都不同。

4

5 回答 5

4

Sql server 将'Alina,Charaidew,Sukapha'其视为单个值,这就是为什么没有得到任何结果。

查询应该像..

SELECT * 
FROM qAll 
WHERE name not in('Alina','Charaidew','Sukapha')
于 2016-03-11T10:07:25.120 回答
4

在 CF 中,您应该使用 cfqueryparam 来查询参数。要将列表作为参数传递,您应该将列表属性添加到 cfqueryparam。您的查询应类似于以下内容:

<cfset nameList = "Alina,Charaidew,Sukapha">
<cfquery name="queryName" datasource="#Application.ds#">
        SELECT * FROM qAll WHERE name NOT IN (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" list="Yes" value="#nameList#" >)    
</cfquery>
于 2016-03-11T10:19:57.337 回答
2

考虑qAll是一个查询对象。

'Alina,Charaidew,Sukapha'表示单个值,因此您需要使用cfqueryparam's list指定它是一个列表,attribute例如:

<cfquery dbtype="query" name="someName">
    SELECT * 
    FROM qAll 
    WHERE name NOT IN (<cfqueryparam cfsqltype="cf_sql_varchar" value="Alina,Charaidew,Sukapha" list="yes" separator=",">)
</cfquery>

注意:- 这是区分大小写的。

于 2016-03-11T10:20:09.473 回答
0

这里有两个部分:

  1. 问题的根源在于您的列表的形成方式。SQL 正在寻找以单引号 (') 作为文本限定符的逗号分隔列表。整个字符串包含在单引号 (') 中,因此被视为一个列表。

你的:

SELECT * 
FROM qAll 
WHERE name not in('Alina,Charaidew,Sukapha') 

正确的 SQL:

SELECT * 
FROM qAll 
WHERE name not in('Alina','Charaidew','Sukapha') 
  1. 在 ColdFusion 中,最好在使用 cfquery 标记时使用 cfqueryparam 标记。这有助于提高性能,如果您的列表是一个变量,则可以保护(有点)免受 sql 注入的影响。请注意 'list="Yes"' 属性。这将在运行时使用单引号作为文本限定符适当地限定您的列表。
    <cfset names = "Alina,Charaidew,Sukapha">
    <cfquery name="queryName" datasource="#Application.ds#">
            SELECT * FROM qAll WHERE name NOT IN (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" list="Yes" value="#nameList#" >)    
    </cfquery>
于 2016-03-21T21:40:29.807 回答
-1

您也可以使用动态 qyery ..

declare @filter nvarchar(50)
,@sql nvarchar(4000)
set @filter ='Alina,Charaidew,Sukapha'

set @sql ='SELECT * 
FROM qAll 
WHERE name not in('''+replace(@filter,',',''',''')+''')';

exec (@sql)
于 2016-03-11T10:09:51.360 回答