sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)で電話番号をフォーマットする

    SQLServerで電話番号をフォーマットする例を次に示します。

    これには、E.164形式(国際番号の場合)での番号のフォーマット、国コードと市外局番の先頭、および必要に応じて国コードから先行ゼロを省略する例が含まれます。

    数字の電話番号

    電話番号が数値として保存されている場合(本来はそうではありません)、FORMAT()を使用できます。 電話番号としてフォーマットする機能。

    例:

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

    結果:

    023-456-7890

    最初の引数は電話番号で、2番目の引数はフォーマット文字列です。この例では、カスタム形式の文字列を使用しています。希望する電話番号の形式に合わせて形式文字列を調整できます:

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

    結果:

    (023) 456-7890

    フォーマット文字列が実際に何をするかを知ることは重要です。ゼロを使​​用する場合は、ゼロ形式指定子があるすべての場所で電話番号に実際に数字が含まれていることを確認する必要があります(そうしないと、誤って番号にゼロが追加される可能性があります)。

    また、各数字に一致するフォーマット指定子があることを確認する必要があります(そうでない場合は、電話番号から数字を削除します)。

    フォーマット文字列を表現する別の方法は、#を使用することです。 フォーマット指定子。ただし、これにより、先行ゼロが電話番号から削除されます。

    これが私が何を意味するかを説明するための例です:

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

    結果:

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

    FORMAT() 関数は、数値タイプと日時値のみを受け入れます。入力した電話番号が実際には数値タイプでない場合は、次のようなエラーが発生する可能性があります。

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

    結果:

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

    このような場合、値を数値タイプに変換するのは簡単です。

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

    結果:

    023-456-7890

    ただし、電話番号は数値タイプとして保存しないでください。

    数値は切り上げまたは切り下げ、計算の実行、重要でないゼロの自動削除などが可能です。

    電話番号は固定値です。すべての桁が重要です(先行ゼロを含む)。明示的に必要な場合を除いて、先行ゼロが失われることは望ましくありません(たとえば、国コードの場合)。また、電話番号が誤って切り上げられたり切り下げられたりすることは望ましくありません。また、電話番号を計算する必要はほとんどありません。

    したがって、電話番号を文字列として保存する方が理にかなっています。 (上記の例のように)フォーマットする前に数値タイプに変換すると、数値に予期しない変更が加えられる可能性があります。

    電話番号がすでに文字列である場合は、次の方法を試してください。

    文字列として保存された電話番号

    電話番号が文字列として保存されている場合は、STUFF()を使用できます 関連する場所の電話番号に適切な文字列を挿入する機能。

    例:

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

    結果:

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

    最初の引数は元の文字列(この場合は電話番号)であり、4番目の引数は挿入する文字列です。 2番目の引数は、4番目の引数を挿入する場所を指定します。

    3番目の引数は、元の文字列から削除する文字数を指定します(特定の文字を新しい文字列に置き換える場合)。この場合、文字を削除したくないので、0を使用します 。

    元の電話番号の形式によっては、REPLACE()を使用する別の方法があります。 働き。これが役立つ例としては、電話番号がすでに区切り文字でフォーマットされているが、別の区切り文字に置き換える必要がある場合があります。

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

    結果:

    023-456-7890

    国際番号

    E.164は、国際電話番号の形式を定義する国際規格です。

    E.164番号は、[+][country code][area code][local phone number]の形式になっています 最大15桁にすることができます。

    これは、国コード、市外局番、および電話番号を連結するために2つの方法を使用する例です。

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

    結果:

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

    最初のメソッドはCONCAT()を使用します 関数であり、2番目は連結演算子(+)を使用します 。

    この例では、米国ベースの数値をフォーマットしています。多くの国では、市外局番に先行ゼロがあり、E.164形式を使用する場合は削除する必要があります。

    先行ゼロを抑制する1つの方法は、市外局番を数値に変換してから元に戻すことです。

    英国を拠点とする番号でその手法を使用する例を次に示します。

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

    結果:

    +442034567890

    この場合、先行ゼロは削除されました。

    これは、以前の米国ベースの番号(国コードで先行ゼロを使用しない)に対して実行された同じコードです。

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

    結果:

    +14154567890

    今回は国コードは3桁のままでした。


    1. カテゴリごとに上位10件のレコードを選択

    2. スポットライトクラウドアラームの収集時間

    3. SQL右結合

    4. HerokuとRails:PostgresでのGemロードエラー、ただしGEMFILEで指定