Gunakan fungsi ekspresi reguler di Fabric Data Warehouse

Berlaku untuk:✅ Titik akhir analitik SQL dan Gudang di Microsoft Fabric

Fungsi ekspresi reguler (regex) memungkinkan Anda mencocokkan pola teks kompleks dan memanipulasi data string secara langsung dalam kueri T-SQL Anda. Gunakan untuk memvalidasi format, mengekstrak nilai dari teks semi-terstruktur, menghitung kemunculan pola, serta membersihkan atau menyembunyikan data tanpa memindahkannya keluar dari data warehouse.

Note

Ekspresi reguler saat ini sedang dalam pratinjau.

Warehouse dan endpoint SQL analytics mendukung fungsi regular expression scalar. Setiap fungsi ini mengembalikan satu nilai per baris input, sehingga Anda dapat menggunakannya dalam ekspresi SELECT, WHERE, JOIN, GROUP BY, ORDER BY, dan CASE.

Note

Hanya fungsi ekspresi reguler skalar yang tersedia di Warehouse. Fungsi bernilai tabel REGEXP_MATCHES dan REGEXP_SPLIT_TO_TABLE tidak didukung.

Fungsi yang didukung

Function Tipe pengembalian Description
REGEXP_LIKE Boolean Menunjukkan apakah input teks sesuai dengan pola regex. Gunakan sebagai predikat, misalnya dalam klausa WHERE atau ekspresi CASE.
REGEXP_REPLACE Ekspresi string Mengembalikan string sumber dengan kemunculan pola regex digantikan oleh string pengganti. Jika tidak ditemukan kecocokan, mengembalikan string asli.
REGEXP_SUBSTR Ekspresi untai Mengembalikan kemunculan substring yang ke-n yang sesuai dengan pola regex.
REGEXP_INSTR int Mengembalikan posisi awal atau akhir dari substring yang cocok.
REGEXP_COUNT int Mengembalikan jumlah kali pola regex muncul dalam sebuah string.

Syntax

REGEXP_LIKE ( string_expression, pattern_expression [ , flags ] )

REGEXP_REPLACE ( string_expression, pattern_expression [ , string_replacement [ , start [ , occurrence [ , flags ] ] ] ] )

REGEXP_SUBSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , flags [ , group ] ] ] ] )

REGEXP_INSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , return_option [ , flags [ , group ] ] ] ] ] )

REGEXP_COUNT ( string_expression, pattern_expression [ , start [ , flags ] ] )

Untuk deskripsi lengkap setiap argumen, lihat referensi fungsi yang ditautkan di Supported functions.

Penanda

Argumen opsional flags berupa nilai char atau varchar hingga 30 karakter yang mengatur modifier yang sesuai. Jika Anda memberikan flag yang saling bertentangan, flag terakhir yang berlaku. Misalnya, 'ic' menghasilkan pencocokan peka huruf besar/kecil.

Tanda Description
c Pencocokan peka huruf besar/kecil. Ini adalah default.
i Pencocokan yang Tidak Peka Huruf Besar/Kecil.
m Mode multi-baris: ^ dan $ cocok dengan awal dan akhir setiap baris, selain awal dan akhir teks.
s Mari kita . cocokkan karakter newline \n.

Considerations

  • Argumen string_expression menerima tipe string karakter. Nilai besar (varchar(max)) didukung hingga 2 MB.
  • Argumen pattern_expression mendukung panjang maksimum 8.000 byte.
  • Fungsi ekspresi reguler tidak menghormati aturan kolasi. Pencocokan dapat berbeda dari perbandingan string lain, seperti LIKE. Untuk mengontrol sensitivitas huruf besar/kecil, gunakan flag i dan c daripada mengandalkan kolasi kolom. Untuk informasi selengkapnya, lihat Kolate Gudang Data.
  • REGEXP_LIKE mengembalikan nilai Boolean dan tidak dapat dikembalikan langsung sebagai kolom. Untuk mengembalikan hasil sebagai kolom, bungkus dalam ekspresi CASE.

Examples

Contoh berikut menggunakan set data inline kecil, sehingga Anda dapat menjalankannya di endpoint analitik warehouse atau SQL mana pun.

A. Filter baris yang sesuai dengan pola

Gunakan REGEXP_LIKE dalam WHERE klausa untuk mengembalikan hanya baris dengan format alamat email yang valid.

SELECT CustomerId, Email
FROM (VALUES
        (1, 'anna@contoso.com'),
        (2, 'not-an-email'),
        (3, 'Bob.Smith@Fabrikam.org')
     ) AS c (CustomerId, Email)
WHERE REGEXP_LIKE(Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

Untuk mengembalikan hasil kecocokan sebagai kolom, bungkus REGEXP_LIKE dalam ekspresi CASE:

SELECT Email,
       CASE WHEN REGEXP_LIKE(Email, '@contoso\.com$', 'i') THEN 'Internal' ELSE 'External' END AS EmailType
FROM (VALUES ('anna@CONTOSO.com'), ('bob@fabrikam.org')) AS c (Email);

B. Ekstrak nilai dari teks

Gunakan REGEXP_SUBSTR untuk mengekstrak nomor pesanan pertama dalam format ORD- diikuti oleh digit dari komentar teks bebas.

SELECT Comment,
       REGEXP_SUBSTR(Comment, 'ORD-\d+') AS OrderNumber
FROM (VALUES
        ('Customer called about ORD-10293 and ORD-10311.'),
        ('No order referenced.')
     ) AS t (Comment);

Untuk mengekstrak hanya sebagian dari kecocokan, gunakan grup tangkap. Kueri berikut mengembalikan domain setiap alamat email:

SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);

C. Hitung kemunculan pola

Gunakan REGEXP_COUNT untuk menghitung berapa banyak angka yang muncul di setiap string.

SELECT Comment,
       REGEXP_COUNT(Comment, '\d+') AS NumberCount
FROM (VALUES
        ('Shipped 3 boxes on 12 May, invoice 4471.'),
        ('No numbers here.')
     ) AS t (Comment);

D. Temukan posisi kecocokan

Gunakan REGEXP_INSTR untuk menemukan posisi awal, dan posisi akhir, dari rangkaian digit pertama.

SELECT ProductCode,
       REGEXP_INSTR(ProductCode, '\d+')             AS FirstDigitStart,
       REGEXP_INSTR(ProductCode, '\d+', 1, 1, 1)    AS FirstDigitEnd
FROM (VALUES ('BK-R93R-62'), ('HL-U509')) AS p (ProductCode);

E. Bersihkan dan samarkan data

Gunakan REGEXP_REPLACE untuk menstandarisasi nomor telepon dengan grup tangkap, dan untuk menyembunyikan semua kecuali empat digit terakhir.

SELECT Phone,
       REGEXP_REPLACE(Phone, '^(\d{3})-(\d{3})-(\d{4})$', '(\1) \2-\3') AS FormattedPhone,
       REGEXP_REPLACE(Phone, '^\d{3}-\d{3}', '***-***')               AS MaskedPhone
FROM (VALUES ('425-555-0187'), ('206-555-0142')) AS c (Phone);

Kueri berikut menggabungkan spasi berulang menjadi satu spasi:

SELECT REGEXP_REPLACE('Fabric    Data   Warehouse', '\s+', ' ') AS CleanText;

F. Kelompokkan dan agregasikan berdasarkan nilai yang diekstrak

Karena fungsi-fungsi tersebut bersifat skalar, Anda dapat menggunakannya dalam klausa GROUP BY. Kueri berikut menghitung pelanggan per domain email.

SELECT LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1)) AS EmailDomain,
       COUNT(*) AS Customers
FROM (VALUES
        ('anna@contoso.com'),
        ('bob@Contoso.com'),
        ('chris@fabrikam.org')
     ) AS c (Email)
GROUP BY LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1));