我有表 a 和 b. 在表 a 中有一個欄位 a1,它有兩種格式 xxxxx 或 xxxxx.xx。我想根據 if a1 contains no dot then a.a1=b.b1 else substring(a.a1,0 to dot pos) =b.b1.How to write join conditions if the second format xxxxx 查詢a和b .xx 不是固定長度嗎?謝謝。
uj5u.com熱心網友回復:
您可以使用:
SELECT *
FROM a
INNER JOIN b
ON (a.a1 = b.b1 OR a.a1 LIKE b.b1 || '.%')
或者:
SELECT *
FROM a
INNER JOIN b
ON ((a.a1 NOT LIKE '%.%' AND a.a1 = b.b1) OR a.a1 LIKE b.b1 || '.%')
對于樣本資料:
CREATE TABLE a (a1) AS
SELECT 'abcde' FROM DUAL UNION ALL
SELECT 'abc.def' FROM DUAL UNION ALL
SELECT 'abcd.ef' FROM DUAL;
CREATE TABLE b (b1) AS
SELECT 'abc' FROM DUAL UNION ALL
SELECT 'abcd' FROM DUAL UNION ALL
SELECT 'abcde' FROM DUAL;
輸出:
A1 B1 abcde abcde abc.def 美國廣播公司 abc檔案 A B C D
db<>在這里擺弄
uj5u.com熱心網友回復:
可以對運算式進行連接。因此,解決方案是在表上創建一個格式為“xxxx.xx”的運算式,以提取聯接需要的值。
這可以使用這樣的運算式來完成:
CASE WHEN INSTR(a.ca1,'.') = 0
THEN ca1
ELSE SUBSTR(a.ca1,1,INSTR(a.ca1,'.') - 1)
END
該函式將回傳直到第一個“。”的所有內容。如果字串包含“.”,否則它將回傳字串。這也可以實作,REGEXP_REPLACE但性能不如舊的SUBSTR.
WITH tablea (ca1) AS
(
SELECT 'ABC.XX' FROM DUAL UNION ALL
SELECT 'CDE.HHAA88' FROM DUAL UNION ALL
SELECT 'A123.XYZ' FROM DUAL UNION ALL
SELECT 'KLM' FROM DUAL
),
tableb (cb1) AS
(
SELECT 'ABC' FROM DUAL UNION ALL
SELECT 'DEF' FROM DUAL UNION ALL
SELECT 'KLM' FROM DUAL UNION ALL
SELECT 'A123' FROM DUAL
)
SELECT a.ca1
FROM tablea a
JOIN tableb b ON b.cb1 = CASE WHEN INSTR(a.ca1,'.') = 0 THEN ca1 ELSE SUBSTR(a.ca1,1,INSTR(a.ca1,'.') - 1) END ;
CA1
----------
ABC.XX
KLM
A123.XYZ
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356377.html
