从查询中过滤名称列表
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>
注意:- 这是区分大小写的。
这里有两部分:
- 问题的根源在于您的列表形成方式。 SQL 正在寻找一个以逗号分隔的列表,并将单引号 (') 作为文本限定符。整个字符串包含在单引号 (') 中,因此被视为一个列表。
你的:
SELECT *
FROM qAll
WHERE name not in('Alina,Charaidew,Sukapha')
正确SQL:
SELECT *
FROM qAll
WHERE name not in('Alina','Charaidew','Sukapha')
- 在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>
我有一个类似的查询:
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>
注意:- 这是区分大小写的。
这里有两部分:
- 问题的根源在于您的列表形成方式。 SQL 正在寻找一个以逗号分隔的列表,并将单引号 (') 作为文本限定符。整个字符串包含在单引号 (') 中,因此被视为一个列表。
你的:
SELECT *
FROM qAll
WHERE name not in('Alina,Charaidew,Sukapha')
正确SQL:
SELECT *
FROM qAll
WHERE name not in('Alina','Charaidew','Sukapha')
- 在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>