ฟังก์ชั่นห้อง Android + หน้าต่าง

ฉันพยายามใช้ฟังก์ชั่นหน้าต่างในการสืบค้นห้อง โปรแกรมแยกวิเคราะห์กำลังบ่นเกี่ยวกับคำถามของฉัน ฉันแค่พยายามเพิ่มนิพจน์ "ROW_NUMBER() OVER (เรียงตามคอลัมน์)" ในคำสั่ง select ของฉัน หากไม่มีนิพจน์นี้ คิวรีจะทำงานอย่างถูกต้อง

ข้อผิดพลาดของพาร์เซอร์:

extraneous input '(' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE, 
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, 
K_END, K_EXCEPT, K_EXPLAIN, K_FROM, K_GROUP, K_INSERT, K_INTERSECT, 
K_LIMIT, K_ORDER, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, 
K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UNION, K_UPDATE, K_VACUUM, 
K_VALUES, K_WHERE, K_WITH, UNEXPECTED_CHAR}
mismatched input ')' expecting {<EOF>, ';', ',', '=', '*', '+', '-', 
'||', '/', '%', '<<', '>>', '&', '|', '<', '<=', '>', '>=', '==', '!=', 
'<>', K_ALTER, K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN, 
K_COLLATE, K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP, 
K_END, K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE, 
K_LIMIT, K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP, 
K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, 
K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}
extraneous input ')' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE, 
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, 
K_END, K_EXPLAIN, K_INSERT, K_LIMIT, K_PRAGMA, K_REINDEX, K_RELEASE, 
K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM, 
K_VALUES, K_WITH, UNEXPECTED_CHAR} extraneous input 'add_permutation' 
expecting {<EOF>, ';', ',', '=', '*', '+', '-', '||', '/', '%', '<<', 
'>>', '&', '|', '<', '<=', '>', '>=', '==', '!=', '<>', K_ALTER, 
K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN, K_COLLATE, 
K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP, K_END, 
K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE, K_LIMIT, 
K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP, K_REINDEX, 
K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, 
K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}

person Jerome Dupont    schedule 08.03.2019    source แหล่งที่มา


คำตอบ (3)


Android Room จะไม่ใช้เวอร์ชันของ SQLite ที่มีฟังก์ชัน Windows ซึ่งต้องใช้ SQLite 3.25.0 หรือสูงกว่า ตาม:-

เพิ่มการรองรับฟังก์ชันหน้าต่างใน SQLite ด้วยเวอร์ชัน 3.25.0 (2018-09-15) นักพัฒนา SQLite ใช้เอกสารประกอบฟังก์ชันหน้าต่าง PostgreSQL เป็นข้อมูลอ้างอิงหลักเกี่ยวกับวิธีการทำงานของฟังก์ชันหน้าต่าง กรณีทดสอบจำนวนมากถูกเรียกใช้งานกับ PostgreSQL เพื่อให้แน่ใจว่าฟังก์ชันหน้าต่างทำงานในลักษณะเดียวกันทั้งใน SQLite และ PostgreSQL ฟังก์ชันหน้าต่าง

Android API 28 ล่าสุดดูเหมือนจะใช้ 3.19 เนื่องจากไม่อยู่ในรายการ android Database.sqlite ดังนั้นจึงใช้แบบเดียวกับ API 27

ด้วยเหตุนี้ SQLite จึงเห็นส่วนคำสั่งที่ไม่รู้จักเป็นข้อผิดพลาดทางไวยากรณ์

person MikeT    schedule 08.03.2019
comment
ขอบคุณไมค์สำหรับคำอธิบาย มันสมเหตุสมผลแล้ว - person Jerome Dupont; 20.03.2019
comment
@JeromeDupont วิธีแก้ปัญหาคืออะไร? - person Jaimin Modi; 09.06.2021

เป็นข้อผิดพลาดทางไวยากรณ์ใน SQL Query ของคุณ

ตรวจสอบให้แน่ใจว่าเมื่อคุณสร้างแบบสอบถาม ให้เว้นวรรคที่ท้ายแต่ละบรรทัด

person Amit raj    schedule 25.06.2020

อันที่จริงเวอร์ชัน SQLite ที่ฝังอยู่ใน Android ยังไม่มีฟังก์ชั่นหน้าต่าง แต่ฉันต้องการโพสต์วิธีแก้ปัญหาที่ได้รับแรงบันดาลใจจากคำถามนี้: วิธีใช้ ROW_NUMBER ใน sqlite หากใครกำลังประสบปัญหานี้บน Android

ตัวอย่างเช่นในความสัมพันธ์นี้:

| id | value | updated_at                     |
-----------------------------------------------
| 1  | yes   | 2020-11-26 11:27:45.662 +00:00 |
| 3  | yes   | 2020-11-27 17:19:45.662 +00:00 |
| 4  | yes   | 2020-11-26 11:21:45.662 +00:00 |
| 6  | no    | 2020-11-26 14:42:45.662 +00:00 |
| 9  | yes   | 2020-11-27 15:08:45.662 +00:00 |
-----------------------------------------------

คุณสามารถใช้แบบสอบถามนี้เพื่อรับเฉพาะแถว 'ใช่' ที่เรียงลำดับโดยคอลัมน์ updated_at ที่เกี่ยวข้องกับหมายเลขแถว:

SELECT
    id,
    value,
    (
        SELECT
            count(*)
        FROM
            tbl b
        WHERE
            a.updated_at >= b.updated_at
            AND value = 'yes'
    ) AS row_num,
    updated_at
FROM
    tbl a
WHERE
    value = 'yes'
ORDER BY updated_at

มันให้ผลลัพธ์ดังต่อไปนี้:

| id | value | row_num | updated_at                     |
---------------------------------------------------------
|  4 |   yes |   1     | 2020-11-26 11:21:45.662 +00:00 |
|  1 |   yes |   2     | 2020-11-26 11:27:45.662 +00:00 |
|  9 |   yes |   3     | 2020-11-27 15:08:45.662 +00:00 |
|  3 |   yes |   4     | 2020-11-27 17:19:45.662 +00:00 |
---------------------------------------------------------

โปรดระวังว่าส่วนคำสั่ง OVER (ORDER BY updated_at) ที่ปกติแล้วจะปรากฏในฟังก์ชันหน้าต่าง ROW_NUMBER จะถูกแทนที่ด้วยส่วนคำสั่ง WHERE a.updated_at >= b.updated_at ของแบบสอบถามย่อยซึ่งสร้างคอลัมน์ row_num นอกจากนี้ คุณต้องกรองแถวของแบบสอบถามย่อยนี้เช่นเดียวกับที่คุณกรองในแบบสอบถามหลัก มิฉะนั้น หมายเลขแถวจะพิจารณาแถวทั้งหมดของตาราง และคุณจะไม่ได้รับผลลัพธ์ที่คาดหวัง นั่นคือส่วน AND value = 'yes' ของแบบสอบถาม

person Nicolas Prugne    schedule 05.12.2020