动态 IN 子句的问题

问题描述 投票:0回答:2

我有一个可用车型列表存储在数据库字段中(不要问..),我需要在查询的 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

有什么见解吗?

sql oracle plsql
2个回答
0
投票

您可以尝试以下方法

SELECT * FROM Table1 WHERE model IN
(
select regexp_substr(field1, '[^,]+',1,level)
from config_table
connect by level <=regexp_count(field1, '[^,]+'));

0
投票

其中一个选项是使用 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       */
© www.soinside.com 2019 - 2024. All rights reserved.