从查询中过滤名称列表

Filtering a list of names from query

我有一个类似的查询:

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

这是行不通的。最好的方法是什么?因为这个列表是动态生成的,可能每次都不同。

Sql 服务器将 'Alina,Charaidew,Sukapha' 视为单个值,这就是为什么没有得到任何结果的原因。

查询应该像..

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

你也可以使用动态查询..

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)

在 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>

Considering qAll is a query object.

'Alina,Charaidew,Sukapha' 表示单个值,因此您需要使用 cfqueryparam 的列表 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>

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

这里有两部分:

  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>