如何在DB2中使用Search multiple LIKE for IN条件

时间:2015-01-05 11:43:31

标签: sql select db2 sql-like in-operator

  SELECT *
  FROM XYZ
  WHERE column1 IN (X1,Y1,Z1);

我想在此选择查询中使用 LIKE ;如何用 IN 编写 LIKE 语句,类似于以下查询:

  SELECT * 
  FROM XYZ 
  WHERE column1 LIKE IN  ($P{COLUMN});

另一个例子: -

  

select * from(选择REPLACE(REFEV_VEH_TYPE,'','')||   更换(REFEV_CATEGORY,'','')||更换(REFEV_USAGE,'','')||   将TREF_ENF_VEHICLE_TYPE中的UC替换为(REFEV_BODY_CODE,'','')   aa aa.UC LIKE('%06TBISUM%')

UC
------
06TBISUM
  

select * from(选择REPLACE(REFEV_VEH_TYPE,'','')||   更换(REFEV_CATEGORY,'','')||更换(REFEV_USAGE,'','')||   将TREF_ENF_VEHICLE_TYPE中的UC替换为(REFEV_BODY_CODE,'','')   aa aa.UC LIKE('%B')

 UC
----------
06TGISJB
06TGITJB
  

select * from(选择REPLACE(REFEV_VEH_TYPE,'','')||   更换(REFEV_CATEGORY,'','')||更换(REFEV_USAGE,'','')||   将TREF_ENF_VEHICLE_TYPE中的UC替换为(REFEV_BODY_CODE,'','')   aa aa.UC LIKE('%BAS')

UC
----------
06BCIBAS
05BCABAS
05BCBBAS

我想知道的结果是:

选择*来自( 选择REPLACE(REFEV_VEH_TYPE,'','')||更换(REFEV_CATEGORY,'','')||更换(REFEV_USAGE,'','')||替换(REFEV_BODY_CODE,'','')为UC 来自TREF_ENF_VEHICLE_TYPE)aa 其中aa.UC IN('%06TBISUM%','%B','%BAS' )。

UC
------
06TBISUM
06TGISJB
06TGITJB
06BCIBAS
05BCABAS
05BCBBAS

我使用的参数是 $ P {COLUMN} 。 我想使用IN LIKE($ P {COLUMN})通过 $ P {COLUMN} 参数搜索多个。有人知道吗?

3 个答案:

答案 0 :(得分:0)

LIKE操作在功能上等同于多个OR操作。 所以..

  SELECT *
  FROM XYZ
  WHERE ( column1 like 'X1' OR column1 like 'X2' OR column1 like 'X3' )

答案 1 :(得分:0)

尝试

其中REGEXP_LIKE(aa.UC,'。+ [06TBISUM。* | B | BAS]。+')

将*替换为*(如果我将*转换为斜体)

答案 2 :(得分:-1)

您不能在DB2中将单个变量用作数组,但您可以split it with a recursive CTE

这是一个无需定义功能的版本:

WITH Split AS (SELECT '' AS value, txt, LOCATE(',', txt) AS nxt
               FROM (VALUES($P{COLUMN})) t(txt)
               UNION ALL
               SELECT DECODE(nxt, 0, txt, SUBSTR(txt, 1, nxt - 1)),
                      DECODE(nxt, 0, '', SUBSTR(txt, nxt + 1)),
                      DECODE(txt, '', 0, LOCATE(',', txt, nxt + 1))
               FROM Split
               WHERE LENGTH(txt) > 0), 

     SearchData AS (SELECT value
                    FROM Split
                    WHERE value <> '')

SELECT uc
FROM (SELECT REPLACE(refev_veh_type, ' ', '') 
              || REPLACE(refev_category, ' ', '') 
              || REPLACE(refev_usage, ' ', '') 
              || REPLACE(refev_body_code, ' ', '') AS uc
      FROM TRef_ENF_Vehicle_Type ) T
JOIN SearchData
  ON T.uc LIKE SearchData.value

(未经测试,因为我没有方便的DB2实例)

假设

$P{COLUMN}包含以下字符串:'%06TBISUM%,%B,%BAS'