Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Định dạng số điện thoại trong SQL Server (T-SQL)

Dưới đây là một số ví dụ về định dạng số điện thoại trong SQL Server.

Điều này bao gồm các ví dụ về định dạng số ở định dạng E.164 (đối với số quốc tế), viết trước mã quốc gia và mã vùng, cũng như bỏ qua số 0 ở đầu mã quốc gia khi được yêu cầu.

Số điện thoại

Nếu số điện thoại được lưu trữ dưới dạng giá trị số (không nên có), bạn có thể sử dụng FORMAT() chức năng định dạng nó thành số điện thoại.

Ví dụ:

SELECT FORMAT(0234567890, '000-000-0000');

Kết quả:

023-456-7890

Đối số đầu tiên là số điện thoại và đối số thứ hai là chuỗi định dạng. Trong ví dụ này, tôi đang sử dụng một chuỗi định dạng tùy chỉnh. Bạn có thể điều chỉnh chuỗi định dạng cho phù hợp với định dạng số điện thoại mong muốn:

SELECT FORMAT(0234567890, '(000) 000-0000');

Kết quả:

(023) 456-7890

Điều quan trọng là phải biết chuỗi định dạng thực sự làm gì. Khi sử dụng các số không, bạn cần đảm bảo rằng số điện thoại thực sự có các chữ số ở mọi nơi có định dạng số 0 (nếu không, bạn có thể vô tình thêm các số không vào số).

Bạn cũng sẽ cần đảm bảo rằng có một công cụ định dạng để khớp với từng chữ số (nếu không, bạn sẽ xóa các chữ số khỏi số điện thoại).

Một cách khác để thể hiện chuỗi định dạng là với # định dạng định dạng. Tuy nhiên, điều này sẽ dẫn đến việc xóa mọi số 0 ở đầu số điện thoại.

Dưới đây là một ví dụ để minh họa ý tôi muốn nói:

SELECT 
    FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
    FORMAT(0234567890, '###-###-####') AS "###-###-####";

Kết quả:

+----------------+----------------+
| 000-000-0000   | ###-###-####   |
|----------------+----------------|
| 023-456-7890   | 23-456-7890    |
+----------------+----------------+

FORMAT() hàm chỉ chấp nhận kiểu số và giá trị ngày giờ. Nếu số điện thoại nhập thực sự không phải là một loại số, thì có thể bạn sẽ gặp lỗi, giống như sau:

SELECT FORMAT('0234567890', '000-000-0000');

Kết quả:

Msg 8116, Level 16, State 1, Line 1
Argument data type varchar is invalid for argument 1 of format function.

Trong những trường hợp như vậy, thật dễ dàng để chuyển đổi giá trị thành kiểu số:

SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');

Kết quả:

023-456-7890

Nhưng dù sao thì số điện thoại cũng không nên được lưu trữ dưới dạng số.

Các giá trị số có thể được làm tròn lên hoặc xuống, thực hiện các phép tính trên chúng, tự động xóa các số 0 không quan trọng, v.v.

Số điện thoại là một giá trị cố định. Mọi chữ số đều có nghĩa (kể cả các số 0 ở đầu). Chúng tôi không muốn các số 0 ở đầu bị thiếu trừ khi chúng tôi yêu cầu rõ ràng điều này (ví dụ:đối với mã quốc gia). Và chúng tôi không muốn số điện thoại của mình vô tình bị làm tròn lên hoặc xuống. Và có vẻ như bạn sẽ không cần thực hiện các phép tính trên số điện thoại của mình.

Vì vậy, sẽ có ý nghĩa hơn khi lưu trữ số điện thoại dưới dạng chuỗi. Việc chuyển đổi chúng sang kiểu số trước khi định dạng chúng (như trong ví dụ trên) vẫn có thể dẫn đến những thay đổi không mong muốn đối với số.

Nếu số điện thoại đã là một chuỗi, hãy thử phương pháp sau.

Số điện thoại được lưu trữ dưới dạng chuỗi

Nếu số điện thoại được lưu trữ dưới dạng chuỗi, bạn có thể sử dụng STUFF() chức năng chèn các chuỗi thích hợp vào số điện thoại ở những vị trí có liên quan.

Ví dụ:

SELECT
    STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
    STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";

Kết quả:

+--------------+----------------+
| Format 1     | Format 2       |
|--------------+----------------|
| 023-456-7890 | (023) 456-7890 |
+--------------+----------------+

Đối số đầu tiên là chuỗi gốc (trong trường hợp này là số điện thoại) và đối số thứ tư là chuỗi để chèn. Đối số thứ hai chỉ định nơi để chèn đối số thứ tư.

Đối số thứ ba chỉ định số lượng ký tự cần xóa khỏi chuỗi ban đầu (trong trường hợp bạn muốn thay thế một số ký tự nhất định bằng chuỗi mới). Trong trường hợp của chúng tôi, chúng tôi không muốn xóa bất kỳ ký tự nào và vì vậy chúng tôi sử dụng 0 .

Tùy thuộc vào định dạng của số điện thoại ban đầu, một cách khác để thực hiện là sử dụng REPLACE() hàm số. Một ví dụ về nơi điều này có thể hữu ích là khi số điện thoại đã được định dạng bằng dấu phân cách, nhưng nó cần được thay thế bằng dấu phân tách khác:

SELECT REPLACE('023 456 7890', ' ', '-');

Kết quả:

023-456-7890

Số quốc tế

E.164 là một tiêu chuẩn quốc tế xác định định dạng cho các số điện thoại quốc tế.

Các số E.164 được định dạng [+][country code][area code][local phone number] và có thể có tối đa mười lăm chữ số.

Dưới đây là một ví dụ sử dụng hai phương pháp để ghép mã quốc gia, mã vùng và số điện thoại:

SELECT 
    CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
    '+' + '1' + '415' + '4567890' AS 'Concatenation Operator';

Kết quả:

+---------------------+--------------------------+
| CONCAT() Function   | Concatenation Operator   |
|---------------------+--------------------------|
| +14154567890        | +14154567890             |
+---------------------+--------------------------+

Phương thức đầu tiên sử dụng CONCAT() và hàm thứ hai sử dụng toán tử nối (+ ).

Ví dụ đó định dạng một số dựa trên Hoa Kỳ. Ở nhiều quốc gia, mã vùng có số 0 đứng đầu cần được loại bỏ khi sử dụng định dạng E.164.

Một cách để loại bỏ bất kỳ số 0 ở đầu nào là chuyển đổi mã vùng thành giá trị số và quay lại một lần nữa.

Dưới đây là một ví dụ về việc sử dụng kỹ thuật đó trên một số dựa trên Vương quốc Anh:

SELECT CONCAT(
        '+', 
        '44', 
        CAST(CAST('020' AS int) AS varchar(3)), 
        '34567890'
        );

Kết quả:

+442034567890

Trong trường hợp này, số 0 ở đầu đã bị bỏ.

Dưới đây là cùng một mã chạy với số dựa trên Hoa Kỳ trước đó (không sử dụng số 0 ở đầu trong mã quốc gia):

SELECT CONCAT(
        '+', 
        '1', 
        CAST(CAST('415' AS int) AS varchar(3)), 
        '4567890'
        );

Kết quả:

+14154567890

Lần này mã quốc gia vẫn ở ba chữ số.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thư viện gốc sqljdbc_auth.dll đã được tải trong một trình tải lớp khác

  2. Tạo SQL Tạo tập lệnh cho các bảng hiện có với Truy vấn

  3. Lỗi SQL Server 206:Xung đột kiểu toán hạng

  4. Câu lệnh cập nhật động với tên cột biến

  5. Di chuyển Cơ sở dữ liệu SQL Server sang Đám mây