Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hợp nhất hai tập lệnh SQL sử dụng điều kiện if trong truy vấn Chọn

Tôi sẽ bỏ qua câu lệnh where và tạo một cột cho mã bưu chính Numeric và một cột cho mã kia. Như thế này:

SELECT 
    [Fm].[Id], 
    [Sdp].[FirstName], 
    [Sdp].[LastName], 
    [Sdp].[SSN],
    [Sdp].[StoreName], 
    (
        CASE WHEN ISNUMERIC([Sdp].[PostalCode])=1
            THEN 0
            ELSE NULL
        END
    ) AS NumericPostalCode,
    (
        CASE WHEN ISNUMERIC([Sdp].[PostalCode])=0
            THEN [Sdp].[PostalCode]
            ELSE NULL
        END
    ) AS PostalCode,
    [Fc].[Id], 
    [Sdp].[Address]
FROM 
    [SRM].[SiteMembers].[DProfile] AS [Sdp]
INNER JOIN [SRM].[SiteMembers].[Member] AS [Sm]
    ON [Sdp].[Member_Id] = [Sm].[Id]
INNER JOIN [FRM].[Members].[Member] AS [Fm]
    ON [Sm].[UserId] = [Fm].[UserId]
INNER JOIN [SRM].[General].[City] AS [Sc]
    ON [Sdp].[City_Id]=[Sc].[Id]
INNER JOIN [FRM].[General].[City] AS [Fc]
    ON [Fc].[Title]=[Sc].[Title] 
    COLLATE SQL_Latin1_General_CP1_CI_AS´

Chỉnh sửa 1

Tôi biết rằng điều này sẽ dẫn đến hai cột. Nhưng bạn không thể phải loại dữ liệu trong một cột. Nhưng tôi nghĩ rằng bạn cũng có thể làm điều đó như thế này.

SELECT 
    [Fm].[Id], 
    [Sdp].[FirstName], 
    [Sdp].[LastName], 
    [Sdp].[SSN],
    [Sdp].[StoreName],
    (
        CASE WHEN ISNUMERIC([Sdp].[PostalCode])=0
            THEN [Sdp].[PostalCode]
            ELSE '0'
        END
    ) AS PostalCode,
    [Fc].[Id], 
    [Sdp].[Address]

Điều này sẽ hoạt động vì số là '0' dưới dạng varchar.

Chỉnh sửa 2

Bạn cũng có thể làm như thế này:

SELECT CAST('asdasd' AS sql_variant)
UNION ALL
SELECT CAST(0 AS sql_variant)

Nhưng đây là một giải pháp bẩn cho vấn đề này. Sql_variant là một đối tượng cơ sở dữ liệu. Vì vậy, kết luận của tôi là:Sử dụng để cột nếu bạn có những kiểu dữ liệu khác nhau. Nếu các giá trị có thể là cùng một kiểu dữ liệu, hãy sử dụng cùng một cột. Không sử dụng sql_variant để giải quyết các vấn đề như thế này. Bạn sẽ phải trả một cái giá đắt trong việc duy trì mã.

Hy vọng điều này giúp đỡ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ánh xạ ký tự / tìm kiếm và thay thế ký tự bằng ký tự trong SQL Server 2008 R2

  2. Hiệu suất của các biến bảng trong SQL Server

  3. Làm cách nào để tạo một hàm SQL Server để nối nhiều hàng từ một truy vấn con vào một trường được phân tách duy nhất?

  4. ĐỌC VỚI (NOLOCK) so với SET GIAO DỊCH MỨC ĐỘ CỰC KỲ ĐÃ ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT

  5. Có bất kỳ nhược điểm nào khi luôn sử dụng nvarchar (MAX) không?