2009-10-18 41 views
30

Có thể đặt biệt hiệu tên cột và sau đó sử dụng tên đó trong câu lệnh CASE không? Ví dụ,SQL: Tên cột bí danh để sử dụng trong tuyên bố CASE

SELECT col1 as a, CASE WHEN a = 'test' THEN 'yes' END as value FROM table; 

Tôi cố gắng để bí danh cột vì thực sự tuyên bố trường hợp của tôi sẽ được tạo lập trình, và tôi muốn cột rằng tuyên bố trường hợp sử dụng phải được quy định trong SQL thay vì phải vượt qua thông số khác cho chương trình.

Trả lời

28

Tôi nghĩ rằng MySql và MsSql sẽ không cho phép điều này bởi vì họ sẽ cố gắng tìm tất cả các cột trong mệnh đề CASE dưới dạng cột o f các bảng trong mệnh đề WHERE.

Tôi không biết những gì DBMS bạn đang nói về, nhưng tôi đoán bạn có thể làm một cái gì đó như thế này trong bất kỳ DBMS:

SELECT *, CASE WHEN a = 'test' THEN 'yes' END as value FROM (
    SELECT col1 as a FROM table 
) q 
0

Không có trong MySQL. Tôi đã thử nó và tôi nhận được lỗi sau:

ERROR 1054 (42S22): Unknown column 'a' in 'field list'
0

Cũng trong MSSQL

SELECT col1 AS o, e = CASE WHEN o < GETDATE() THEN o ELSE GETDATE() END 
FROM Table1 

Returns:

Msg 207, Level 16, State 3, Line 1 
Invalid column name 'o'. 
Msg 207, Level 16, State 3, Line 1 
Invalid column name 'o'. 

Tuy nhiên nếu tôi thay đổi để CASE KHI col1 ... THEN col1 nó hoạt động

47

này:

SELECT col1 as a, 
     CASE WHEN a = 'test' THEN 'yes' END as value 
    FROM table; 

... sẽ không phải là. Đây sẽ:

SELECT CASE WHEN a = 'test' THEN 'yes' END as value 
    FROM (SELECT col1 AS a 
      FROM TABLE) 

Tại sao bạn sẽ không sử dụng:

SELECT t.col1 as a, 
     CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
    FROM TABLE t; 

... Tôi không biết.

+1

Điều này phải được đánh dấu là câu trả lời đúng! – erbaker

1

Tôi sử dụng CTE để giúp soạn các truy vấn SQL phức tạp nhưng không phải tất cả RDBMS đều hỗ trợ chúng. Bạn có thể coi chúng như các khung nhìn truy vấn phạm vi. Đây là một ví dụ trong t-sql trên máy chủ SQL.

With localView1 as (
select c1, 
     c2, 
     c3, 
     c4, 
     ((c2-c4)*(3))+c1 as "complex" 
    from realTable1) 
    , localView2 as (
select case complex WHEN 0 THEN 'Empty' ELSE 'Not Empty' end as formula1, 
     complex * complex as formula2  
    from localView1) 
select * 
from localView2 
+1

WITH cú pháp được hỗ trợ trong Oracle 9i +, SQL Server 2005+ và DB2 (phiên bản dunno). Trong trường hợp của Oracle & SQL Server, WITH cú pháp chỉ là một thay thế cho các khung nhìn nội tuyến. –

0
  • Nếu bạn viết chỉ điều kiện bình đẳng chỉ: Select Case columns1 Khi 0 rồi 'Value1' khi 1 rồi 'Value2' khác 'Unknown' End

  • Nếu bạn muốn viết lớn hơn, Ít hơn hoặc bằng bạn phải làm như thế này: Chọn trường hợp khi [Tên cột]> 0 rồi 'giá trị1' Khi [Tên cột] = 0 Hoặc [Tên cột] < 0 thì 'giá trị2' Khác 'Unkownvalue' End

Từ tablename

Cảm ơn ôngBuntha Khin

0
SELECT 
    a AS [blabla a], 
    b [blabla b], 
    CASE c 
     WHEN 1 THEN 'aaa' 
     WHEN 2 THEN 'bbb' 
     ELSE 'unknown' 
    END AS [my alias], 
    d AS [blabla d] 
FROM mytable 
1

Nó sẽ hoạt động. Hãy thử điều này

Select * from 
       (select col1, col2, case when 1=1 then 'ok' end as alias_col 
       from table) 
     as tmp_table 
order by 
     case when @sortBy = 1 then tmp_table.alias_col end asc 
2

Ngựa Non @OMG - Một trong những lý do của tôi không sử dụng đoạn mã sau

SELECT t.col1 as a, 
    CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
FROM TABLE t; 

có thể rằng t.col1 không phải là một cột thực tế trong bảng. Ví dụ: nó có thể là một giá trị từ một cột XML như

Select XMLColumnName.value('(XMLPathOfTag)[1]', 'varchar(max)') 
as XMLTagAlias from Table 
-4

làm cho nó dễ dàng như vậy.

select columnnameshow = (CASE tipoventa 
when 'CONTADO' then 'contadito' 
when 'CREDITO' then 'cred' 
else 'no result' 
end) from Promocion.Promocion 
Các vấn đề liên quan