-->

在选择情况和where子句避免重复的条件(Avoiding repetitive condition

2019-10-28 13:46发布

我有一个表,说TAB1有以下的列 -
USER_ID NUMBER(5),
PHN_NO1 CHAR(20),
PHN_NO2 CHAR(20)

我不得不从TAB1记录读取到另一个表TAB2,使得所有记录与任一所述两个或两个PHN_NO1和PHN_NO2之一是长度为10的,并用5开始。
如果在一个记录,只说PHN_NO1满足条件和PHN_NO2没有的话,TAB2.P1应该是一样的,但TAB1.PHN_NO1应该TAB2.P2为NULL。
如果没有两个都满足该条件,则该记录应该不被插入到TAB2

TAB2结构将如
从TAB1选择保持的记录的ROWID - USER_ID数(5)
P1 CHAR(10) -保持TAB1.PHN_NO1如果它是长度为10的,并用5开始,否则为NULL
P2 CHAR(10) -保持TAB1.PHN_NO2如果它是长度为10的,并用5 beigns,否则为NULL

我可以写下面的查询来实现上述目标,但在情况与条件是重复的。 请建议的方式来实现上述以更好的方式。


CREATE TABLE TAB2

选择
用户身份,
CASE WHEN
(LENGTH(TRIM(PHN_NO1))= 10,TRIM(PHN_NO1)像 '5%')
然后
CAST(TRIM(PHN_NO1)为CHAR(10))
其他
CAST(NULL为CHAR(10))
END为P1,
CASE(LENGTH(TRIM(PHN_NO2))= 10,TRIM(PHN_NO2)像 '5%')
然后
CAST(TRIM(PHN_NO2)为CHAR(10))
其他
CAST(NULL为CHAR(10))
END AS P2
哪里
(LENGTH(TRIM(PHN_NO1)= 10,TRIM(PHN_NO1)像 '5%')
要么
(LENGTH(TRIM(PHN_NO2)= 10,TRIM(PHN_NO2)像 '5%')

Answer 1:

你当然可以! 你必须虽然使用了一些条件:

INSERT INTO New_Phone 
        SELECT user_id, phn_no1, phn_no2
        FROM (SELECT user_id,
              CASE WHEN LENGTH(TRIM(phn_no1)) = 10 AND TRIM(phn_no1) like '5%'
                   THEN SUBSTR(phn_no1, 1, 10) ELSE NULL END phn_no1, 
              CASE WHEN LENGTH(TRIM(phn_no2)) = 10 AND TRIM(phn_no2) like '5%'
                   THEN SUBSTR(phn_no2, 1, 10) ELSE NULL END phn_no2
              FROM Old_Phone) Old
        WHERE phn_no1 IS NOT NULL
        OR phn_no2 IS NOT NULL;

(我有一个工作SQL小提琴例子 。)

这应该在任何RDBMS工作。 需要注意的是,因为你的数据,这是不太可能比你原来了高性能的(这也不会使用索引,给出的TRIM() 它也不太可能会更好 ,因为大多数主要的RDBMS都能够重新使用的每行确定的函数的结果。

呵呵,应该指出的是,国际上的电话号码可长达15位的长度(与国内的6或更小的最小值)。 也许使用VARCHAR (并保存自己的一些TRIM() S,太)? 和INTEGER (或者BIGINT ,也许TINYINT )更多地被用于替代IDS, NUMBER是有点怪。



文章来源: Avoiding repetitive conditions in the select case and where clause