0

次の列を持つTAB1というテーブルがあります
-USER_IDNUMBER(5)、
PHN_NO1 CHAR(20)、
PHN_NO2 CHAR(20)

TAB1から別のテーブルTAB2にレコードをフェッチして、すべてのレコードが2つまたはPHN_NO1とPHN_NO2はどちらも長さが10で、5から始まります。
レコードでPHN_NO1のみが条件を満たし、PHN_NO2が満たさない場合、TAB2.P1はTAB1.PHN_NO1と同じである必要がありますが、TAB2.P2はNULLである必要があります。
2つのどちらも条件を満たさない場合は、レコードをTAB2に挿入しないでください。

TAB2の構造は次のようになります
。USER_IDnumber(5)-TAB1
P1 char(10)から選択されたレコードのROWIDを保持します-長さが10で5で始まる場合はTAB1.PHN_NO1を保持し、それ以外の場合はNULL
P2 char(10) -長さが10で、5で始まる場合は、TAB1.PHN_NO2を保持します。それ以外の場合は、NULLです。

上記を達成するために以下のクエリを書くことができますが、CASEとWHEREの条件は繰り返されます。上記をより良い方法で達成する方法を提案してください。


CREATE TABLE TAB2
AS
SELECT
USER_ID、
CASE WHEN
(LENGTH(TRIM(PHN_NO1))= 10 AND TRIM(PHN_NO1)like '5%')
THEN
CAST(TRIM(PHN_NO1)as CHAR(10))
ELSE
CAST(NULL as CHAR( 10))
END AS P1、
CASE(LENGTH(TRIM(PHN_NO2))= 10 AND TRIM(PHN_NO2)like '5%')
THEN
CAST(TRIM(PHN_NO2)as CHAR(10))
ELSE
CAST(NULL as CHAR(10 ))
END AS P2
WHERE
(LENGTH(TRIM(PHN_NO1)= 10 AND TRIM(PHN_NO1)like '5%')
OR
(LENGTH(TRIM(PHN_NO2)= 10 AND TRIM(PHN_NO2)like '5%')

4

1 に答える 1

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 Fiddleの実例があります。)

これは、すべてのRDBMSで機能するはずです。データがあるため、これは元のデータよりもパフォーマンスが低下する可能性は低いことに注意してください(インデックスを使用していなかった場合TRIM())。また、ほとんどの主要なRDBMSが行ごとの決定論的関数の結果を再利用できることを考えると、これが改善される可能性は低くなります。

ああ、国際的には、電話番号の長さは最大15桁になる可能性があることに注意してください(国内では最低6桁以下)。多分使用しますVARCHAR(そしてあなた自身もいくつかを節約しますTRIM())?そしてINTEGER(またはBIGINT、多分TINYINT)は代理IDによく使用されますNUMBERが、少し奇妙です。

于 2012-08-24T23:02:45.027 に答える