Làm cách nào để sử dụng các biến trong một select (SQL Server)?


8

Nếu tôi muốn tính toán một cột và sử dụng kết quả trong hơn 1 cột, làm thế nào để tôi làm điều này mà không thực hiện tính toán hai lần?

Thí dụ:

SELECT LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com' as EMail
      ,hashbytes('SHA1', LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com') as HashedEmail
FROM sometable

Làm thế nào để tôi tránh viết điều này hai lần mà không sử dụng nhiều hơn một lựa chọn?

Câu trả lời:


13

Bảng dẫn xuất

SELECT
    EMail,
    hashbytes('SHA1', EMail) AS HashedEmail
FROM
    (
    SELECT LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com' as EMail
    FROM sometable
   ) foo

hoặc CTE:

;WITH cEMail AS
(
    SELECT LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com' as EMail
    FROM sometable
)
SELECT
    EMail,
    hashbytes('SHA1', EMail) AS HashedEmail
FROM
    cEMail

Tuy nhiên, trong trường hợp này tôi sẽ xem xét sử dụng cột được tính toán với hàm băm được tính toán trước


Miễn là tên miền là tĩnh và động theo yêu cầu, cột máy tính là một ý tưởng tuyệt vời.
Robert Miller

3

Đầu tiên, tôi nghĩ rằng bạn muốn viết hashbyte thay vì hastopes. chuỗi băm không có chức năng SQL.

Đây là mã sẽ cung cấp cho bạn muốn bạn muốn tôi hy vọng.

DECLARE @yourvariable nvarchar (50) =  '@somedomain.com';

SELECT LOWER(SUBSTRING([NAME], 4, 100)) + @yourvariable  as EMail
      ,HashBytes('SHA1', LOWER(SUBSTRING([NAME], 4, 100)) +  @yourvariable) as HashedEmail 
FROM sometable;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.