есть два списка и нужно преобразовать их в запрос - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть два отдельных списка, которые дают мне результаты, я хочу преобразовать эти отдельные списки в одном запросе, я использовал listoquery из cflib, но это только для 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>

или у меня есть для l oop

вот так

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

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020
<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>
1 голос
/ 03 апреля 2020

Предполагая, что два списка имеют одинаковую длину, вы можете сделать что-то вроде этого.

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