【问题标题】:have two lists and need to convert them into query有两个列表,需要将它们转换为查询
【发布时间】:2020-04-05 03:03:42
【问题描述】:

我有两个单独的列表给我结果,我想在一个查询中转换这些单独的列表,我确实使用了来自 cfliblistoquery ,但它只适用于 1,而不适用于更多查询。

我该怎么做,任何线索,不能使用queryappend,因为我在lucee

<cffunction name="listToQuery" access="public" returntype="query" output="false" 
    hint="Converts a list to a single-column query.">
    <cfargument name="list" type="string" required="yes" hint="List to convert.">
    <cfargument name="delimiters" type="string" required="no" default="," hint="Things that separate list elements.">
    <cfargument name="column_name" type="string" required="no" default="column" hint="Name to give query column.">

    <cfset var query = queryNew(arguments.column_name)>
    <cfset var index = ''>

    <cfloop list="#arguments.list#" index="index" delimiters="#arguments.delimiters#">
        <cfset queryAddRow(query)>
        <cfset querySetCell(query,arguments.column_name,index)>
    </cfloop>

    <cfreturn query>
</cffunction>

或者我有一个for循环

喜欢这个

https://trycf.com/gist/28e9f2b8ff2992e0dc9f78709a0d2041/lucee5?theme=monokai

【问题讨论】:

  • 要么将列表合并为一个,要么传入一个列表数组。然后还有一个额外的循环在附加值之前遍历每个列表。
  • 您能提供这两个列表的示例数据吗?你能描述一下结果应该是什么样子吗?现在,我不清楚你的期望。

标签: coldfusion lucee


【解决方案1】:
<cfscript>

    list1 = '1,2,3,4,5,6,7,8';
    list2 = '5,5,5,5,7,7,4,4';

    result = queryNew("");

    queryAddListAsNewColumn(result, "id", list1);
    queryAddListAsNewColumn(result, "name", list1);
    queryAddListAsNewColumn(result, "cid", list2);

    writeDump(result);

    /*
     * Adds the provided list to the query as a new column. Automatically expands query records.
    */
    function queryAddListAsNewColumn(query, columnName, list) {

        // prepare list data
        LOCAL.data      = listToArray(ARGUMENTS.list);
        LOCAL.dataCount = arrayLen(LOCAL.data);

        // add new column to query
        queryAddColumn(ARGUMENTS.query, ARGUMENTS.columnName);

        // expand query if list to add exceeds the current record count
        LOCAL.rowDelta = (LOCAL.dataCount - ARGUMENTS.query.recordCount);
        if (LOCAL.rowDelta > 0) {
            queryAddRow(ARGUMENTS.query, LOCAL.rowDelta);
        }

        // add list data to each cell in the new column
        for (LOCAL.i = 1; LOCAL.i <= LOCAL.dataCount; LOCAL.i++) {
            querySetCell(ARGUMENTS.query, ARGUMENTS.columnName, LOCAL.data[LOCAL.i], LOCAL.i);
        }

        // returning isn't necessary because the passed query argument is a reference, return whatever suits your needs
        return ARGUMENTS.query;
    }

</cfscript>

【讨论】:

    【解决方案2】:

    假设两个列表的长度相同,你可以这样做。

    myQuery = QueryNew(dummy, varchar);
    QueryAddColumn(myQuery, Column1, varchar, ListToArray(List1);
    QueryAddColumn(myQuery, Column2, varchar, ListToArray(List2);
    QueryDeleteColumn(myQuery, dummy);
    

    【讨论】:

    • 如果你有 for 循环它不起作用,并且 addColumn 将不起作用,我尝试使用 querysetcell 但说列已经存在
    • 这是一个这样的问题似乎无法找到解决办法
    • soemthing,但我似乎无法找到解决方案,您能否提供要点中的任何示例或想法
    • 不,我错了。根据要点@SignUp,他们确实想要两列-您尝试过上述方法吗?此外,要点中的代码和信息应该在您的问题中。
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2018-11-07
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多