2010-08-23 32 views
8

Có cách nào gọn gàng để áp dụng mặt nạ cho chuỗi trong truy vấn SQL Server không?Áp dụng Mặt nạ để Định dạng Chuỗi trong Truy vấn Máy chủ SQL/Xem

Tôi có hai bảng, một với số điện thoại được lưu trữ như varchar không có literals 0155567890 và một loại điện thoại, trong đó có một mặt nạ cho loại số điện thoại: (##) #### ####

là gì cách tốt nhất để trả về một chuỗi (cho một tài liệu hợp nhất) để truy vấn trả lại số điện thoại được định dạng đầy đủ:

(01) 5556 7890 
+0

Câu trả lời của tôi có giúp bạn không? –

Trả lời

7

tôi cần này cũng có, và nhờ giả Sjuul, tôi đã có thể tạo ra một chức năng để làm điều này.

CREATE FUNCTION [dbo].[fx_FormatUsingMask] 
(
    -- Add the parameters for the function here 
    @input nvarchar(1000), 
    @mask nvarchar(1000) 
) 
RETURNS nvarchar(1000) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @result nvarchar(1000) = '' 
    DECLARE @inputPos int = 1 
    DECLARE @maskPos int = 1 
    DECLARE @maskSign char(1) = '' 

    WHILE @maskPos <= Len(@mask) 
    BEGIN 
     set @maskSign = substring(@mask, @maskPos, 1) 

     IF @maskSign = '#' 
     BEGIN 
      set @result = @result + substring(@input, @inputPos, 1) 
      set @inputPos += 1 
      set @maskPos += 1 
     END 
     ELSE 
     BEGIN 
      set @result = @result + @maskSign 
      set @maskPos += 1 
     END 
    END 
    -- Return the result of the function 
    RETURN @result 

END 
2

Đây chỉ là những gì xuất hiện trong đầu của tôi. Tôi không biết liệu đó có phải là giải pháp tốt nhất hay không nhưng tôi nghĩ nó có thể hoàn toàn khả thi.

Thực hiện một chức năng với tên applyMask (Orso)

Mã giả:

WHILE currentPosition < Length(PhoneNr) AND safetyCounter < Length(Mask) 
    IF currentSign = "#" 
     result += Mid(PhoneNr, currentPosition, 1) 
     currentPosition++ 
    ELSE 
     result += currentSign 
     safetyCounter++ 
    END 
END 
Return result 
2

Chỉ trong trường hợp nếu ai đó cần chức năng bảng có giá trị.

Cách tiếp cận 1

create function ftMaskPhone 
(
    @phone varchar(30), 
    @mask varchar(50) 
) 
returns table as 
return 
    with ci(n, c, nn) as (
     select 
      1, 
      case 
       when substring(@mask, 1, 1) = '#' then substring(@phone, 1, 1) 
       else substring(@mask, 1, 1) 
      end, 
      case when substring(@mask, 1, 1) = '#' then 1 else 0 end 
     union all 
     select 
      n + 1, 
      case 
       when substring(@mask, n + 1, 1) = '#' then substring(@phone, nn + 1, 1) 
       else substring(@mask, n + 1, 1) 
      end, 
      case when substring(@mask, n + 1, 1) = '#' then nn + 1 else nn end 
     from ci where n < len(@mask)) 
    select (select c + '' from ci for xml path(''), type).value('text()[1]', 'varchar(50)') PhoneMasked 
GO 

Sau đó áp dụng nó như

declare @mask varchar(50) 
set @mask = '(##) #### ####' 

select pm.PhoneMasked 
from Phones p 
    outer apply ftMaskPhone(p.PhoneNum, @mask) pm 

Cách tiếp cận 2

Hãy rời abowe một cho lịch sử. Dưới đây là một trong nhiều hơn performant.

create function ftMaskPhone 
(
    @phone varchar(30), 
    @mask varchar(50) 
) 
returns table as 
return 
    with v1(N) as (
     select 1 union all select 1 union all select 1 union all select 1 union all select 1 
     union all 
     select 1 union all select 1 union all select 1 union all select 1 union all select 1 
    ), 
    v2(N) as (select 1 from v1 a, v1 b), 
    v3(N) as (select top (isnull(len(@mask), 0)) row_number() over (order by @@spid) from v2), 
    v4(N, C) as (
     select N, isnull(substring(@phone, case when c.m = 1 then row_number() over (partition by c.m order by N) end, 1), substring(@mask, v3.N, 1)) 
     from v3 
      cross apply (select case when substring(@mask, v3.N, 1) = '#' then 1 end m) c 
    ) 
    select Value = (
     select c + '' 
     from v4 
     order by N 
     for xml path(''), type 
    ).value('text()[1]', 'varchar(50)') 
go 
0

Nếu bạn cần "che", thay vì ẩn giá trị thực bằng một giá trị khác, sau đó "vạch mặt" một chuỗi, bạn có thể thử chức năng này hoặc mở rộng cho vấn đề đó. :)

https://stackoverflow.com/a/22023329/2175524

Các vấn đề liên quan