web-dev-qa-db-ja.com

SELECTステートメントで電話番号をフォーマットする方法

テーブル名studentのデータベースがあります。

学生のregister_numberphone_numberを表示したいと思います。

phone_numberの形式は次のとおりです。

+91-123-456-7890

そして、phone_numberがNULLの場合、N/Aが表示されます。

テーブルは次のようになります。

R_NO      |     STUDENT_NAME    |  PHONE_NUMBER
-------------------------------------------------------
  1       |      Rajesh         |  9632545123
  2       |      Sridevi        |  9512647359
  3       |      Shiva          |  9632155862
  4       |      HariHaran      |  8426911231
  5       |      Ravi           |  9111558899
  6       |      Pauline        |  NULL
4
user94804

1つの部分couldは次のように処理されます:

IFNULL(phone_number, 'N/A');

ただし、実際には、フォーマット要件はSQLではなく、アプリケーションコードで行うのが最善です。

1
Rick James

地域によって、プレフィックスの桁数が異なります( wikipedia's list ):

COALESCE(CONCAT('+',
  CASE
    WHEN LEFT(phone_number, 1) IN ('1', '7')
      THEN INSERT(INSERT(INSERT(phone_number, 2, 0, '-'), 6, 0, '-'), 10, 0, '-')
    WHEN CONVERT(LEFT(phone_number, 2), SIGNED) IN (21, 22, 23, 24, 25, 26, 29, 35, 37, 38, 42, 50, 59,
                                                    67, 68, 69, 80, 85, 87, 88, 96, 97, 99)
      THEN INSERT(INSERT(INSERT(phone_number, 4, 0, '-'), 8, 0, '-'), 12, 0, '-')
    ELSE   INSERT(INSERT(INSERT(phone_number, 3, 0, '-'), 7, 0, '-'), 11, 0, '-') END), 'N/A')

上記のクエリでは、すべての電話番号は+Country_code-XXX-XXX-XXXXと表示されますが、各エリアには特定のフォーマットルールがあり、大きく異なります。そのため、フォーマットが+54-X-XXXX-XXXXであるオーストラリアなど、特定の地域ではフォーマットがおかしいように見えます。

以下のリンクには、次のように機能するマスク関数のコードがあります。

SELECT mask(991234567890, '+##-###-###-####')
-> +99-123-456-7890

https://stackoverflow.com/questions/10112718/mysql-output-masking-i-e-phone-number-ssn-etc-display-formatting

N/Aに関しては、次のようなものが機能するはずです。

SELECT IfNull(phone_number, 'N/A')
0
sqlnoob