Методы XML не допускаются в предложении GROUP BY

Это не то, как вы делаете что-то на Java. В Java нет динамических переменных. Переменные Java должны быть объявлены в исходном коде (*). Период.

В зависимости от того, чего вы пытаетесь достичь, вы должны использовать массив, List или Map; например,

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

Можно использовать динамическое отражение для обозначения переменных , которые были объявлены в исходном коде. Однако это работает только для переменных, являющихся членами класса (т. Е. Статических полей и полей экземпляра). Он не работает для локальных переменных. См. Пример «быстрый и грязный» @ fyr.

Однако делать это без необходимости в Java - это плохая идея. Это неэффективно, код более сложный, и поскольку вы полагаетесь на проверку времени выполнения, он более хрупкий.

И это не «переменные с динамическими именами». Он лучше описывает динамический доступ к переменным со статическими именами.


* - Это утверждение немного неточно. Если вы используете BCEL или ASM, вы можете «объявить» переменные в файле байт-кода. Но не делай этого! Таким образом, безумие!

1
задан Cyrus_Vivek 16 January 2019 в 17:03
поделиться

2 ответа

DECLARE @xml VARCHAR(8000)  = '<root><que trp=''100001'' ccid=''59748''  /></root>'
DECLARE @recordXml XML = @xml

SELECT
    dat.trip_no
    , MAX( dat.check_call_id ) AS max_check_call_id
FROM (

    SELECT
        T.a.value( '@trp[1]','CHAR(6)' ) AS trip_no,
        T.a.value( '@ccid[1]','INT' ) AS check_call_id
    FROM @recordXml.nodes( '/root/que' ) T( a )
    WHERE
        LEN( T.a.value('@trp[1]','CHAR(6)') ) = 6
        AND ISNUMERIC( T.a.value( '@trp[1]','CHAR(6)' ) ) = 1
        AND CONVERT( INT, T.a.value( '@trp[1]','CHAR(6)' ) ) > 0

) AS dat
GROUP BY
    dat.trip_no
0
ответ дан Critical Error 16 January 2019 в 17:03
поделиться

Использовать подзапрос ...

SELECT
    trip_no,
    MAX(check_call_id)   AS check_call_id
FROM
(
    SELECT
        T.a.value('@trp[1]' , 'CHAR(6)') AS trip_no,
        T.a.value('@ccid[1]', 'INT'    ) AS check_call_id
    FROM
        @recordXml.nodes('/root/que')T(a)
    WHERE
        LEN(T.a.value('@trp[1]','CHAR(6)')) = 6
        AND ISNUMERIC(T.a.value('@trp[1]','CHAR(6)')) = 1
        AND CONVERT(INT, T.a.value('@trp[1]','CHAR(6)')) > 0
)
    AS parsed_xml
GROUP BY
    trip_no
0
ответ дан MatBailie 16 January 2019 в 17:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: