有没有办法在oracle中将区号与phone号码分开
is there any way to separate area code from phone number in oracle
oracle上有没有函数可以给他phone号作为参数输出为:code area + phone number.
示例:
参数:+3323658568526 或 003323658568526(法国国家代码)
return :
- 代码区:+33
- phone 号码:23658568526
处理此要求的最佳方法是为区号和 Phone 号码设置两个单独的列。这有助于提高性能 - 因为不需要执行可能对性能产生负面影响的子字符串操作。
另一个原因是phone数字中的位数可能会有所不同,因此可能很难找到代码结束的位置(除非您使用分隔符,这又会导致子字符串操作) .
当需要在用户界面显示数字时,可以拼接显示。
也有助于 运行 查询,例如 "What is the area that most of our customers come from?",因为您可以进行
等查询
SELECT AREA_CODE, COUNT(*) FROM TABLE GROUP BY AREA_CODE ORDER BY 2 DESC;
由于区号没有很多不同的值,因此将其作为索引中的前导列也有助于执行索引跳过扫描和索引快速全扫描。
您可以使用 SUBSTR.
例如,
SQL> WITH sample_data AS(
2 SELECT '+3323658568526' num FROM dual UNION ALL
3 SELECT '003323658568526' num FROM dual
4 )
5 -- end of sample_data mimicking real table
6 SELECT num,
7 CASE
8 WHEN SUBSTR(num, 1, 1) = '+'
9 THEN SUBSTR(num, 1, 3)
10 ELSE '+'
11 ||ltrim(SUBSTR(num, 1, 4), '0')
12 END area_code ,
13 CASE
14 WHEN SUBSTR(num, 1, 1) = '+'
15 THEN SUBSTR(num, 4)
16 ELSE SUBSTR(num, 5)
17 END phone_number
18 FROM sample_data;
NUM AREA_ PHONE_NUMBER
--------------- ----- ------------
+3323658568526 +33 23658568526
003323658568526 +33 23658568526
SQL>
注意:区号的位数可能会有所不同,在这种情况下,您需要在 CASE 表达式中进行处理。更好的设计是将它们分开存放。您可以进一步标准化数据。
您甚至可以尝试使用正则表达式:
SELECT REGEXP_REPLACE(
phone,
'(\+|00)([0-9][0-9])([0-9]*)',
'+'
) AS AREA,
REGEXP_REPLACE(
phone,
'(\+|00)([0-9][0-9])([0-9]*)',
''
) AS PHONE
FROM (SELECT '003323658568526' phone FROM DUAL
UNION ALL
SELECT '+3323658568526' phone FROM DUAL);
同样,这假设您的区号总是有 2 位数字。
oracle上有没有函数可以给他phone号作为参数输出为:code area + phone number.
示例:
参数:+3323658568526 或 003323658568526(法国国家代码)
return :
- 代码区:+33
- phone 号码:23658568526
处理此要求的最佳方法是为区号和 Phone 号码设置两个单独的列。这有助于提高性能 - 因为不需要执行可能对性能产生负面影响的子字符串操作。
另一个原因是phone数字中的位数可能会有所不同,因此可能很难找到代码结束的位置(除非您使用分隔符,这又会导致子字符串操作) .
当需要在用户界面显示数字时,可以拼接显示。
也有助于 运行 查询,例如 "What is the area that most of our customers come from?",因为您可以进行
等查询 SELECT AREA_CODE, COUNT(*) FROM TABLE GROUP BY AREA_CODE ORDER BY 2 DESC;
由于区号没有很多不同的值,因此将其作为索引中的前导列也有助于执行索引跳过扫描和索引快速全扫描。
您可以使用 SUBSTR.
例如,
SQL> WITH sample_data AS(
2 SELECT '+3323658568526' num FROM dual UNION ALL
3 SELECT '003323658568526' num FROM dual
4 )
5 -- end of sample_data mimicking real table
6 SELECT num,
7 CASE
8 WHEN SUBSTR(num, 1, 1) = '+'
9 THEN SUBSTR(num, 1, 3)
10 ELSE '+'
11 ||ltrim(SUBSTR(num, 1, 4), '0')
12 END area_code ,
13 CASE
14 WHEN SUBSTR(num, 1, 1) = '+'
15 THEN SUBSTR(num, 4)
16 ELSE SUBSTR(num, 5)
17 END phone_number
18 FROM sample_data;
NUM AREA_ PHONE_NUMBER
--------------- ----- ------------
+3323658568526 +33 23658568526
003323658568526 +33 23658568526
SQL>
注意:区号的位数可能会有所不同,在这种情况下,您需要在 CASE 表达式中进行处理。更好的设计是将它们分开存放。您可以进一步标准化数据。
您甚至可以尝试使用正则表达式:
SELECT REGEXP_REPLACE(
phone,
'(\+|00)([0-9][0-9])([0-9]*)',
'+'
) AS AREA,
REGEXP_REPLACE(
phone,
'(\+|00)([0-9][0-9])([0-9]*)',
''
) AS PHONE
FROM (SELECT '003323658568526' phone FROM DUAL
UNION ALL
SELECT '+3323658568526' phone FROM DUAL);
同样,这假设您的区号总是有 2 位数字。