Sql 如何在ListQualife函数中转义逗号?

Sql 如何在ListQualife函数中转义逗号?,sql,coldfusion,Sql,Coldfusion,我是coldfusion的新手。我需要一些帮助。 我的数据库中有公司名称的记录,例如:abc公司。 目前,我正在使用以下查询: SELECT DISTINCT COMPANY FROM ComapanyTable WHERE (Company IN (#ListQualify(form.cCompanyList2, "'", ",")#)) 这个问题是,它将abc,Inc.分开 SELECT DISTINCT Company FROM CompanyTableWHERE (Company

我是coldfusion的新手。我需要一些帮助。 我的数据库中有公司名称的记录,例如:abc公司。 目前,我正在使用以下查询:

SELECT DISTINCT COMPANY FROM ComapanyTable WHERE (Company IN   
(#ListQualify(form.cCompanyList2, "'", ",")#))
这个问题是,它将abc,Inc.分开

SELECT DISTINCT Company FROM CompanyTableWHERE (Company IN ('abc',' 
Inc.','xyz','Inc.'))
我需要按原样获取列表,即:“abc,Inc.”、“xyz,Inc.”,以便以后可以将这些值插入到新表中

插入代码:

<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
        INSERT INTO tblChildCompanyToParent (ParentAccountID, ChildCompany)
            SELECT DISTINCT
            <cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
            FROM CompanyTable
            WHERE Company IN
            (<cfqueryparam value="#ValueList(insertSelect.Company,';' )#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)      
    </cfquery>
选择列表代码

<select multiple name="cCompanyList2" id="cCompanyList2" class="selectCCompany" data-attribute="selCCompany" size="10">
  <cfloop query="childCompanyList"> 
    <option value="#childCompanyList.ChildCompany#">#childCompanyList.Company#</option> 
  </cfloop> 
</select>

无论如何都有办法解决这个问题。

您应该使用cfqueryparam标记的list属性,而不是手动构建SQL in子句

现在,这并不能解决您的核心问题,即您有一个逗号分隔的列表,其中值本身可能包含逗号

不幸的是,ColdFusion不允许在列表值内转义列表分隔符,这是在CFML中使用列表的一个主要缺点。通常,答案是简单地使用一个不同的分隔符,您确信它不会出现在您的数据中,但由于您正在处理如何选择多个表单字段,因此默认的分隔符是逗号

所以现在,我们唯一的选择是确保这些值中永远不会有真正的逗号。第一个建议是不要使用公司名称,而是使用数据库ID(如int或GUID)作为下拉值。在数据库中使用生成键而不是自然键还有其他原因

如果数据库中没有该选项,则需要对select值进行编码。这可以是任何内容—一个简单的replace语句,或者甚至像base 64编码之类的东西,都可以清除公司名称中的逗号,但将其保留在可以在服务器端反转为原始字符串的状态

请记住,这种编码方法将不允许在cfqueryparam中使用list参数,因为每个列表项都需要解析并分别还原为其原始形式。您基本上需要在列表上手动迭代,解码每个值,构建in子句,或者在解码之前更改列表分隔符

我真的,真的建议在数据库中使用整数ID作为主键,因为它确实让您的生活更轻松,并提高了索引扫描的性能。请为孩子们做这件事

最后一点注意:如果您使用的是ColdFusion 10或更高版本,则可以设置它;在Application.cfc中,哪一侧步进整个列表分隔符问题。如果使用不同的分隔符将数组转换为列表,则仍然可以使用cfqueryparam的list属性

<cfqueryparam value="#arrayToList( myArray, '~' )#" list="yes" separator="~"> 

我使用javascript和jquery修复了它

我将所选值添加到一个空数组中

var companyArray= [];
    $('#Company option').each(function() {
        companyArray.push($(this).val());
    });
    var theJoin = companyArray.join(';');
    //added it to an hidden input
    document.getElementById('hiddenInput').value = theJoin;
     //Delete the first semicolon that gets added before the first element
    theJoin.slice(1);
然后对insert查询进行了这些更改

<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
        INSERT INTO tblChildCompanyToParent (Parent_Account_ID, Child_Account_ID)
            SELECT DISTINCT
            <cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
            FROM tblUser
            WHERE Company IN
            (<cfqueryparam value="#form.hiddenInput#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)      
    </cfquery>  

它将在表单中的隐藏输入中找到值,然后将它们插入数据库。cfqueryparam中的separator属性将识别列表没有用分号分隔,并在数据库中添加元素。

form.cCompayList2在没有任何格式的情况下是什么样子的?form.cCompayList2是一个下拉列表childCompanyList.companylist。这是从数据库的另一个表中获取值。您能否确认,在每个公司名称之后都有。像ABC公司,不是所有的,但大多数都有它。考虑使用CHR30作为你的定界符。我正在使用你会做什么,虽然当你有一个公司名称与半冒号,虽然?此解决方案与第一个解决方案存在相同的问题。考虑到您当前的测试数据集,它现在可能会正常工作。
<cfquery name="insertPair" datasource="#DSN#" dbtype="ODBC">
        INSERT INTO tblChildCompanyToParent (Parent_Account_ID, Child_Account_ID)
            SELECT DISTINCT
            <cfqueryparam value = "#form.pCompanyList#" CFSQLType = "CF_SQL_VARCHAR">, Company
            FROM tblUser
            WHERE Company IN
            (<cfqueryparam value="#form.hiddenInput#" CFSQLType = "CF_SQL_VARCHAR" list="true" separator=";">)      
    </cfquery>