ใช้ฟังก์ชันนิพจน์ปกติใน Fabric คลังข้อมูล

นําไปใช้กับ:✅ จุดสิ้นสุดการวิเคราะห์ SQL และ Warehouse ใน Microsoft Fabric

ฟังก์ชัน Regular expression (regex) ช่วยให้คุณจับคู่รูปแบบข้อความที่ซับซ้อนและจัดการข้อมูลสตริงโดยตรงในคําสั่ง T-SQL ของคุณ ใช้ข้อมูลเหล่านี้เพื่อตรวจสอบรูปแบบ ดึงค่าจากข้อความกึ่งโครงสร้าง นับจํานวนรูปแบบที่เกิดขึ้น และทําความสะอาดหรือปกปิดข้อมูลโดยไม่ต้องย้ายออกจากคลังสินค้า

Note

Regular expression กําลังอยู่ในขั้นตอนพรีวิว

Warehouse และ SQL analytics endpoint รองรับฟังก์ชัน regular expression แบบสเกลาร์ ฟังก์ชันแต่ละตัวจะคืนค่าหนึ่งค่าต่อแถวอินพุต ดังนั้นคุณสามารถใช้ใน SELECT รายการ, WHERE, JOIN, GROUP BY, ORDER BY, และ CASE นิพจน์ได้

Note

ใน Warehouse มีเฉพาะฟังก์ชันนิพจน์ปกติแบบสเกลาร์เท่านั้น ฟังก์ชันที่มีค่าเป็นตาราง REGEXP_MATCHES และ REGEXP_SPLIT_TO_TABLE ไม่รองรับ

ฟังก์ชันที่ได้รับการสนับสนุน

Function ชนิดการส่งกลับ Description
REGEXP_LIKE แบบบูลีน ระบุว่าข้อความที่ป้อนตรงกับรูปแบบเรกซ์หรือไม่ ใช้เป็นพรีดิเคต เช่น ใน WHERE อนุประโยคหรือ CASE นิพจน์
REGEXP_REPLACE นิพจน์สตริง คืนค่าสตริงต้นทางโดยแทนที่รูปแบบ regex ด้วยสตริงทดแทน หากไม่พบการจับคู่ จะคืนค่าสตริงต้นฉบับ
REGEXP_SUBSTR นิพจน์สตริง คืนค่าการปรากฏครั้งที่ nของสตริงย่อยที่ตรงกับรูปแบบ regex
REGEXP_INSTR int คืนค่าตําแหน่งเริ่มต้นหรือสิ้นสุดของสตริงย่อยที่จับคู่กัน
REGEXP_COUNT int ส่งคืนจํานวนครั้งที่รูปแบบ regex ปรากฏในสตริง

ไวยากรณ์

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 ] ] )

สําหรับคําอธิบายเต็มรูปแบบของแต่ละอาร์กิวเมนต์ โปรดดูการอ้างอิงฟังก์ชันที่ลิงก์ไว้ใน ฟังก์ชันที่รองรับ

ธง

อาร์กิวเมนต์เสริมflagsคือค่า or varcharchar ที่มีความยาวสูงสุด 30 ตัวอักษร ซึ่งใช้กําหนดตัวปรับแต่งที่ตรงกัน ถ้าคุณให้ธงที่ขัดแย้งกัน ธงสุดท้ายจะชนะ ตัวอย่างเช่น 'ic' ผลลัพธ์คือการจับคู่แบบแยกแยะตัวพิมพ์ใหญ่-เล็ก

ค่าสถานะ Description
c จับคู่แบบแยกตัวพิมพ์ใหญ่-เล็ก นี่คือค่าเริ่มต้น
i การจับคู่แบบไม่สนใจตัวพิมพ์เล็ก-เล็ก
m โหมดหลายบรรทัด: ^ และ $ จับคู่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัด รวมถึงจุดเริ่มต้นและจุดสิ้นสุดของข้อความ
s ให้ . จับคู่อักขระ \nบรรทัดใหม่

ข้อควรพิจารณา

  • อาร์กิวเมนต์นี้ string_expression รับประเภทสตริงอักขระ ค่าที่ใหญ่ (varchar(max)) รองรับได้สูงสุด 2 MB
  • อาร์กิวเมนต์รองรับ pattern_expression ความยาวสูงสุด 8,000 ไบต์
  • ฟังก์ชันนิพจน์ปกติไม่เคารพกฎการจัดเรียงข้อมูล การจับคู่อาจแตกต่างจากการเปรียบเทียบสตริงอื่น ๆ เช่น LIKE. เพื่อควบคุมความไวต่อตัวพิมพ์เล็ก ให้ใช้ i ธง และ c แทนการพึ่งพาการจัดเรียงคอลัมน์ สําหรับข้อมูลเพิ่มเติม โปรดดู คลังข้อมูล collation
  • REGEXP_LIKE คืนค่าบูลีนและไม่สามารถคืนค่าเป็นคอลัมน์โดยตรงได้ หากต้องการคืนผลลัพธ์เป็นคอลัมน์ ให้ห่อด้วย CASE นิพจน์

ตัวอย่าง

ตัวอย่างต่อไปนี้ใช้ชุดข้อมูลขนาดเล็กแบบอินไลน์ ดังนั้นคุณสามารถรันข้อมูลเหล่านี้ในคลังสินค้าหรือจุดสิ้นสุดการวิเคราะห์ SQL ใดก็ได้

ตอบ กรองแถวที่ตรงกับรูปแบบ

ใช้ REGEXP_LIKE ใน WHERE ค่อยประโยคเพื่อคืนเฉพาะแถวที่มีรูปแบบอีเมลที่ถูกต้อง

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,}$');

หากต้องการคืนผลลัพธ์การจับคู่เป็นคอลัมน์ ให้ตัดบรรทัดด้วยREGEXP_LIKECASEนิพจน์:

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. ดึงค่าจากข้อความ

ใช้เพื่อ REGEXP_SUBSTR ดึงหมายเลขคําสั่งซื้อแรกในรูปแบบตาม ORD- ด้วยตัวเลขจากความคิดเห็นแบบข้อความอิสระ

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);

หากต้องการดึงเฉพาะบางส่วนของแมตช์ ให้ใช้กลุ่มจับภาพ คําค้นหาต่อไปนี้จะคืนค่าโดเมนของแต่ละที่อยู่อีเมล:

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

C. การปรากฏรูปแบบการนับ

ใช้เพื่อ REGEXP_COUNT นับจํานวนตัวเลขที่ปรากฏในแต่ละสตริง

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. ค้นหาตําแหน่งของแมตช์

ใช้เพื่อ REGEXP_INSTR หาตําแหน่งเริ่มต้นและตําแหน่งสิ้นสุดของลําดับตัวเลขแรก

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. ทําความสะอาดและปิดข้อมูล

ใช้เพื่อ REGEXP_REPLACE มาตรฐานหมายเลขโทรศัพท์ที่มีกลุ่มจับภาพ และปกปิดตัวเลขทั้งหมด ยกเว้นสี่หลักสุดท้าย

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);

คําสั่งค้นหาต่อไปนี้ย่อพื้นที่ว่างซ้ําให้กลายเป็นพื้นที่เดียว:

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

F. จัดกลุ่มและรวมตามค่าที่สกัดออกมา

เนื่องจากฟังก์ชันเป็นสเกลาร์ คุณจึงสามารถใช้มันใน GROUP BY คลอสได้ คําค้นหาต่อไปนี้นับจํานวนลูกค้าต่อโดเมนอีเมล

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));