我有一个可用车型列表存储在数据库字段中(不要问..),我需要在查询的 IN 子句中使用此列表:
SELECT * FROM Table1 WHERE model IN (SELECT field1 FROM config_table)
以上返回 0 个结果。如果我用实际值列表替换子查询,它就可以正常工作:
SELECT * FROM Table1 WHERE model IN('Model3', 'C300', 'Civic')
我尝试过以各种格式存储模型,但没有任何效果。
'Model3', 'C300', 'Civic'
"Model3", "C300", "Civic"
Model3,C300,Civic
有什么见解吗?
您可以尝试以下方法
SELECT * FROM Table1 WHERE model IN
(
select regexp_substr(field1, '[^,]+',1,level)
from config_table
connect by level <=regexp_count(field1, '[^,]+'));
其中一个选项是使用 CTE 提取模型
WITH -- S a m p l e D a t a :
config_table AS
( Select 'Model3,C300,Civic' "FIELD1" From Dual ),
-- CTE WITH THE MODELS FROM ABOVE
config_models AS
( Select LEVEL "ID",
SubStr(',' || FIELD1 || ',',
InStr(',' || FIELD1 || ',', ',', 1, LEVEL + 0) + 1,
InStr(',' || FIELD1 || ',', ',', 1, LEVEL + 1) - InStr(',' || FIELD1 || ',', ',', 1, LEVEL + 0) - 1 ) "MODEL_NAME"
From config_table
Connect By LEVEL <= Length(FIELD1) - Length(Replace(FIELD1, ',', '')) + 1
),
/* R e s u l t : (config_models)
ID MODEL_NAME
---------- -------------------
1 Model3
2 C300
3 Civic */
table1 AS
( Select 101 "ID", 1 "MAKER_ID", 'Ka' "MODEL_NAME" From Dual Union All
Select 102 "ID", 1 "MAKER_ID", 'Focus' "MODEL_NAME" From Dual Union All
Select 103 "ID", 2 "MAKER_ID", 'Clio' "MODEL_NAME" From Dual Union All
Select 104 "ID", 2 "MAKER_ID", 'Laguna' "MODEL_NAME" From Dual Union All
Select 105 "ID", 3 "MAKER_ID", 'Civic' "MODEL_NAME" From Dual
)
SELECT * FROM Table1 WHERE MODEL_NAME IN (SELECT MODEL_NAME FROM config_models)
或
SELECT t1.*
FROM Table1 t1
INNER JOIN config_models m ON(m.MODEL_NAME = t1.MODEL_NAME)
...结果相同:
/* R e s u l t :
ID MAKER_ID MODEL_NAME
---------- ---------- ----------
105 3 Civic */