所以我有這個簡單的Oracle查詢返回我預期的記錄:ORA-01722無效的數字 - 表連接
SELECT to_number(substr(nr_key,5,4)) as numero
FROM fattura_pa
LEFT JOIN fattura_pa_status on status_id = id
WHERE ute = 'BX' and length(nr_key) < 21
and to_number(substr(nr_key,5,4)) = 88
如果我將它轉換成:
SELECT * FROM (
SELECT to_number(substr(nr_key,5,4)) as numero
FROM fattura_pa
LEFT JOIN fattura_pa_status on status_id = id
WHERE ute = 'BX' and length(nr_key) < 21
)
where numero = 88
它給我的「ORA-01722無效號碼」 錯誤
我不能undrestand爲什麼,因爲我的 「NUMERO = 88」,實際上是一個數字...
最奇怪的是,如果我評論的加入,查詢再次運行:
SELECT * FROM (
SELECT to_number(substr(nr_key,5,4)) as numero
FROM fattura_pa
--LEFT JOIN fattura_pa_status on status_id = id
WHERE ute = 'BX' and length(nr_key) < 21
)
where numero = 88
和連接無關用TE「NUMERO」場...
至於問,我在這裏發佈表格:
CREATE TABLE "FE_ENGINE"."FATTURA_PA"
( "UTE" VARCHAR2(2 BYTE) NOT NULL ENABLE,
"NR_KEY" VARCHAR2(21 BYTE) NOT NULL ENABLE,
"PROGRESSIVO_INVIO" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"XML_CREATO" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"XML_FILE_NAME" VARCHAR2(40 BYTE) NOT NULL ENABLE,
"POSIZIONE" NUMBER(4,0) DEFAULT 1 NOT NULL ENABLE,
"D3_FILE_NAME" VARCHAR2(40 BYTE) NOT NULL ENABLE,
"SPEDITA_IL" DATE,
"ACCETTATA_IL" DATE,
"ARCHIVIATA_IL" DATE,
"STATUS_ID" NUMBER(4,0) NOT NULL ENABLE,
"RIELABORARE" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"ROW_INSTIME" DATE DEFAULT SYSDATE NOT NULL ENABLE,
"ROW_UPTIME" DATE,
"NR_KEY_OLD" VARCHAR2(20 BYTE),
CONSTRAINT "UQ_FATTURA_PA_FILE_NAME_POSIT" UNIQUE ("XML_FILE_NAME", "POSIZIONE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "D3_USR" ENABLE,
CONSTRAINT "FATTURA_PA_PK" PRIMARY KEY ("UTE", "NR_KEY", "PROGRESSIVO_INVIO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "D3_USR" ENABLE,
CONSTRAINT "FK_FATTURA_PA_FATTURA_PA_STATU" FOREIGN KEY ("STATUS_ID")
REFERENCES "FE_ENGINE"."FATTURA_PA_STATUS" ("ID") ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "D3_USR" ;
CREATE TABLE "FE_ENGINE"."FATTURA_PA_STATUS"
( "ID" NUMBER(4,0) NOT NULL ENABLE,
"COD_STATUS" VARCHAR2(16 BYTE) NOT NULL ENABLE,
"DESC_STATUS" VARCHAR2(100 BYTE) NOT NULL ENABLE,
CONSTRAINT "PK_FATTURA_PA_STATUS" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "D3_USR" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "D3_USR" ;
有什麼想法嗎?
[編輯]你的問題,並添加'創建table'所涉及表的語句。 [**格式**](http://stackoverflow.com/help/formatting)文本請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -o -load-images-of-code-on-so-when-asked-question-285557#285557) –
我相信其原因可能在於Oracle在三個查詢中使用的不同執行計劃;你可以請張貼計劃嗎? – Aleksej
絕對是執行計劃。 'substr(nr_key,5,4)'不總是計算一個數字。不同的執行計劃會評估_every_記錄的表達式或僅記錄一部分記錄。短期來說,你需要確定哪些數據是問題。長期來看,你不應該在varchar字段中存儲數字。 –