2010-02-19 45 views
9

Có cách nào chúng ta có thể chỉ định các giá trị trong một tuyên bố trường hợp không? Các tuyên bố dưới đây không thực hiện bởi vì nó nghĩ rằng 53,57,82,83 vv là cột .. Có một công việc xung quanh .. tôi googled lên nhưng không tìm thấy gì mà nói rằng bạn không thể sử dụng trong biểu hiện trường hợp-khi ..TSQL - Case - Giá trị trong?

select 
x = 
case 
    when xvalue in ([52],[57],[82],[83]) 
     then "xvalue" 
    when yvalue in ([01],[02],[11]) 
     then "yvalue" 
    else 
     'NULL' 
    end 
from xyztable 
+0

Đối với phiên bản SQL Server nào, hoặc là điều này cho Sybase? –

+0

Lý do tôi sử dụng dấu ngoặc đơn là .. khi sử dụng cùng IN trong bảng tổng hợp .. MSDN cho tôi biết bằng cách sử dụng như thế này .. SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] TỪ (SELECT DaysToManufacture, StandardCost TỪ Production.Product) AS SourceTable PIVOT ( AVG (StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable; –

+0

Đây là loại cũ nhưng ... bạn đang sử dụng dấu ngoặc vuông với bảng tổng hợp vì bạn đang đánh dấu hiệu quả các cột với câu lệnh IN – Pork

Trả lời

16

Không đặt dấu ngoặc ôm xung quanh các số.

+1

Bỏ phiếu là câu trả lời cũ nhất là câu trả lời :) –

3

Hãy thử điều này:

select 
case 
    when xvalue in (52,57,82,83) 
     then "xvalue" 
    when yvalue in (01,02,11) 
     then "yvalue" 
    else 
     'NULL' 
    end as 'x' 

Nếu bạn muốn sử dụng x, mà tôi đang giả định sẽ là một biến, bạn sẽ muốn định nghĩa nó như thế này:

DECLARE @x int

select 
@x = case 
    when xvalue in (52,57,82,83) 
     then "xvalue" 
    when yvalue in (01,02,11) 
     then "yvalue" 
    else 
     'NULL' 
    end 
+0

@Random: 'X =' giống như 'as x' –

+0

@Gabriel, không phải nếu bạn muốn sử dụng nó sau trong t-sql ...' x = 'và' như x' sẽ chỉ đặt tên cột tương ứng với tên đó, trong khi khai báo biến cho phép bạn truy cập trực tiếp vào nó từ trong cùng một khối t-sql ... –

+0

Đó là những gì tôi đã nói. 'x =' và 'như x' cả hai đều làm điều tương tự. Tôi chỉ chỉ ra rằng không có lý do gì để tin rằng OP muốn sử dụng một biến. Dường như với tôi như poster chỉ muốn sử dụng một bí danh - và 'x =' là giống như 'như x' trong trường hợp đó. –

12

Sử dụng:

SELECT x = CASE 
      WHEN t.xvalue IN (52, 57, 82, 83) THEN 'xvalue' 
      WHEN t.yvalue IN (01, 02, 11) THEN 'yvalue' 
      ELSE NULL 
      END 
    FROM TABLE t 

Giả sử bạn muốn giá trị từ cột, sử dụng:

SELECT x = CASE 
      WHEN t.xvalue IN (52, 57, 82, 83) THEN t.xvalue 
      WHEN t.yvalue IN (01, 02, 11) THEN t.yvalue 
      ELSE NULL 
      END 
    FROM TABLE t 

Bạn nhận ra rằng nếu cả hai Xvalue và Yvalue đang trong nhóm, chỉ có Xvalue sẽ được hiển thị?

+0

upvote cho câu trả lời đúng :) –

1

Chắc chắn, nếu xvalue là cột số, chỉ cần xóa các dấu ngoặc vuông. Sau đó, nó sẽ hoạt động tốt. Các dấu ngoặc đơn nói với máy chủ cơ sở dữ liệu rằng một cái gì đó là một đối tượng cơ sở dữ liệu, vì vậy hãy loại bỏ chúng để chúng được xử lý như một chữ.

1

Trên t-sql, [] số nhận dạng dành cho các ký hiệu trích dẫn như tên cột - bạn có thể có dấu cách và tất cả các ký tự lẻ trong tên cột nếu bạn thực sự muốn. Sử dụng báo giá '' để trích dẫn các chuỗi ký tự.

2

Lý do truy vấn của bạn không hoạt động là nó được viết không chính xác. Xem xét điều này:

in ([01],[02],[11]) 

Đặt [] xung quanh giá trị của bạn có nghĩa là bạn muốn chúng được coi là tên cột. Nếu bạn xóa dấu ngoặc kép thì phần đó sẽ hoạt động. Ngoài ra, hãy xem xét điều này:

then "xvalue" 

bạn cần báo giá đơn tại đây.

else 'NULL' 

Ở đây, bạn có muốn giá trị là NULL hoặc chuỗi "NULL" không? Cách bạn đã viết nó, nó sẽ là chuỗi "NULL"

Để làm cho nó giá trị NULL, viết nó như thế này:

else NULL 

Dưới đây là toàn bộ sự việc một lần nữa, được viết một cách chính xác:

select  
x = 
case  
    when xvalue in (52,57,82,83)  
     then 'xvalue' 
    when yvalue in (01,02,11)  
     then 'yvalue' 
    else 'NULL' 
    end 
from xyztable 
Các vấn đề liên quan