我正在使用 pypika 構建一些查詢。它曾經作業得很好,但我對 Oracle 資料庫上的子查詢有疑問。查詢內容如下
fake_query = Query().from_(my_table).where(my_table.ID == "12345").select(my_table.ID)
QN = AliasedQuery("fake_query_with")
query = (
Query()
.with_(fake_query, "fake_query_with")
.from_(QN)
.select(
QN.star. # problematic line
)
)
df_temp = claim_conn.read_dataframe(query.get_sql())
所以當我運行腳本時,我得到了一個錯誤:
DatabaseError: ORA-00904: "fake_query_with": invalid identifier
pypika 查詢按預期翻譯為字串
WITH fake_query_with AS
(
SELECT "ID"
FROM "MYTABLE"
WHERE "ID"=12345
)
SELECT "fake_query_with".*
FROM fake_query_with
所以這個查詢失敗了,但是如果我用QN.star簡單的替換*,它可以作業,但是我當然失去了別名的有趣用法。我知道這只是一個虛擬片段,但它只是為了演示錯誤。
uj5u.com熱心網友回復:
正如@astentx 在評論中所說,這看起來像是 PyPika 中的一個錯誤。
您可以(可能)通過在代碼中將名稱設為大寫來解決它 - 即"FAKE_QUERY_WITH"在兩個地方。
QN = AliasedQuery("FAKE_QUERY_WITH")
query = (
Query()
.with_(fake_query, "FAKE_QUERY_WITH")
.from_(QN)
.select(
QN.star. # problematic line
)
)
那么生成的 SQL 應該如下所示:
WITH FAKE_QUERY_WITH AS
(
SELECT "ID"
FROM "MYTABLE"
WHERE "ID"=12345
)
SELECT "FAKE_QUERY_WITH".*
FROM FAKE_QUERY_WITH
并且帶引號和不帶引號的識別符號之間的區別將沒有實際意義。
小提琴顯示修改后的 SQL 作業 - 在 PyPika 中未經測驗,但希望這實際上是它會生成的......
uj5u.com熱心網友回復:
我不知道 Python 和 Pypika,但是 - 從 Oracle 的角度來看 - 這就是這里的問題:使用 (evil!) 雙引號。
在 Oracle 中,默認情況下,所有“識別符號”(表名、列名、程序、函式……)都以大寫形式存盤到資料字典中。然后,您可以以任何您想要的方式參考它們:UPPER、Lower 或 MixeD CaSe - 沒有區別,一切都會正常作業。
但是,如果您將名稱括在雙引號中,那么您必須每次都使用雙引號,并遵循您在創建該物件時使用的相同字母大小寫 - 否則,它將不起作用。
例如:
SQL> create table mytable as
2 select 12345 id,
3 'Littlefoot' "NamE"
4 from dual;
Table created.
SQL> select table_name from user_tables where table_name = 'MYTABLE';
TABLE_NAME
------------------------------
MYTABLE --> stored in UPPERCASE
SQL> select column_name from user_tab_columns where table_name = 'MYTABLE';
COLUMN_NAME
------------------------------
ID --> stored in UPPERCASE because there were no double quotes
NamE --> mixed case, as I enclosed the name into double quotes
SQL> select id from mytable; --> reference it any way you want
ID
----------
12345
SQL> select name from mytable; --> reference it exactly as it was created
select name from mytable
*
ERROR at line 1:
ORA-00904: "NAME": invalid identifier
SQL> select "NamE" from mytable;
NamE
----------
Littlefoot
SQL>
在你的情況下:
SQL> WITH fake_query_with AS --> CTE named using lower case, but no double quotes
2 (
3 SELECT "ID"
4 FROM "MYTABLE"
5 WHERE "ID"=12345
6 )
7 SELECT "fake_query_with".* --> double quotes, lower case
8 FROM fake_query_with;
SELECT "fake_query_with".*
*
ERROR at line 7:
ORA-00904: "fake_query_with": invalid identifier
SQL>
如果你想讓它作業,那么要么a)去掉雙引號(如果可以的話;也許 Py* 需要它們,不能說)(這是我真誠的建議)或b)在任何地方使用雙引號:
a) 沒有雙引號
SQL> WITH
2 fake_query_with
3 AS
4 (SELECT id
5 FROM mytable
6 WHERE id = 12345)
7 SELECT fake_query_with.*
8 FROM fake_query_with;
ID
----------
12345
SQL>
b) 雙引號,無處不在
SQL> WITH
2 "fake_query_with"
3 AS
4 (SELECT "ID"
5 FROM "MYTABLE"
6 WHERE "ID" = 12345)
7 SELECT "fake_query_with".*
8 FROM "fake_query_with";
ID
----------
12345
SQL>
看看有沒有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531649.html
上一篇:各部門平均工資
下一篇:從具有不同值的字串中獲取數字
