1

我知道如何强力解决这个问题;我主要是在寻找一个优雅的解决方案来增加我自己对未来的了解。

我有一个包含 20 个代码标志字段的数据表。(CODE_01, CODE_02, CODE_03, ..., CODE_20)

我正在寻找任何这些代码列包含某些值(例如:11、12、24、141 等)的记录

我可以这样做:

Select * from table
where CODE_01 IN (11, 12, 24, 141)
   or CODE_02 IN (11, 12, 24, 141)
   or ...
   or CODE_20 IN (11, 12, 24, 141);

或者像这样:

Select * from table
where 11 IN (CODE_01, CODE_02, ..., CODE_20)
   or 12 IN (CODE_01, CODE_02, ..., CODE_20)
   or 24 IN (CODE_01, CODE_02, ..., CODE_20)
   or 141 IN (CODE_01, CODE_02, ..., CODE_20);

两者都有效,只是复制/粘贴的练习。我想知道是否有类似的东西:

Select * from table
where (11, 12, 24, 141) IN (CODE_01, CODE_02, ..., CODE_20);

或者

Select * from table
where (CODE_01, CODE_02, ..., CODE_20) IN (11, 12, 24, 141);

我想,理论上我可以连接 20 个字段并使用正则表达式进行搜索,但我敢打赌,这是一个非常低效(而且速度很慢)的查询。

谢谢

4

3 回答 3

2

尽管我同意@GorndonLinoff 的观点,即创建code表格可能是“正确”的解决方案,但您可以在不更改表格结构的情况下尝试以下技巧:

如果在编写查询时相关值已知,则可以将内联列表替换为UNION来自 的一组 -ized 查询dual,然后使用IN运算符将​​其连接到您的表中:

SELECT *
FROM   some_table
JOIN   (SELECT 11 as val FROM dual
        UNION ALL
        SELECT 12 as val FROM dual
        UNION ALL
        SELECT 24 as val FROM dual
        UNION ALL
        SELECT 141 as val FROM dual)
ON     val IN (code_01, code_02, ... code_20);

当然,您总是可以用临时表替换一系列SELECTs dual,但这是基本思想。

我在SQLFiddle上创建了一个(相当大的)简化演示,如果你想稍微玩一下的话。

于 2013-11-04T17:45:26.293 回答
0

也许尝试取消数据透视(11g):

with test_data as (
  select 1 as id, 10 as code1, 11 as code2, 12 as code3 from dual
  union all
  select 2 as id, 10 as code1, 14 as code2, 20 as code3 from dual
  union all
  select 3 as id, 10 as code1, 14 as code2, 30 as code3 from dual
)
select distinct id
from test_data t
unpivot (code_value for codes in (code1, code2, code3))
where code_value in (11, 30);

这将返回第 1 行和第 3 行的 ID。

于 2013-11-04T17:59:08.447 回答
0

我不知道这是否会更快,但你可以试试

select * from table t
where exists 
 (Select * From 
   (Select PK, CODE_01 code from table Union 
    Select PK, CODE_02 code from table Union 
    Select PK, CODE_03 code from table Union 
    Select PK, CODE_04 code from table Union 
    ...
    Select PK, CODE_19 code from table Union 
    Select PK, CODE_20 code from table) z
  Where z.PK = t.PK
     And z.code in (11, 12, 24, 141))

或者...

select * from table t
  join (Select PK, CODE_01 code Union 
        Select PK, CODE_02 code Union 
        Select PK, CODE_03 code Union 
        Select PK, CODE_04 code Union 
        ...
        Select PK, CODE_19 code Union 
        Select PK, CODE_20 code) z
    On z.PK = t.PK
Where z.code in (11, 12, 24, 141))
于 2013-11-04T17:48:07.633 回答