2009-05-29 51 views
13

Mục tiêu là thay thế một giá trị số nguyên được trả về trong truy vấn SQL với giá trị char mà số đại diện. Ví dụ:SQL chọn số nguyên thay thế bằng chuỗi

Thuộc tính bảng có nhãn 'Thể thao' được định nghĩa là giá trị số nguyên từ 1-4. 1 = Bóng rổ, 2 = Khúc côn cầu, v.v. Dưới đây là bảng cơ sở dữ liệu và sau đó là kết quả mong muốn.

Cơ sở dữ liệu Bảng:

Player  Team  Sport 
-------------------------- 
Bob  Blue  1 
Roy  Red  3 
Sarah  Pink  4 

mong muốn Đầu ra:

Player  Team  Sport 
------------------------------ 
Bob  Blue  Basketball 
Roy  Red  Soccer 
Sarah  Pink  Kickball 

thực hành tốt nhất để dịch các giá trị số nguyên cho các giá trị String là gì? Sử dụng SQL để dịch các giá trị trước khi chuyển sang chương trình? Sử dụng ngôn ngữ kịch bản để thay đổi giá trị trong chương trình? Thay đổi thiết kế cơ sở dữ liệu?

Trả lời

16

Cơ sở dữ liệu phải giữ giá trị và bạn nên thực hiện kết nối với bảng khác có dữ liệu trong đó.

Vì vậy, bạn nên có một bảng trong đó có nói một danh sách những người

ID Tên FavSport
1 Alex 4
2 muỗi 2

Và sau đó một bảng trong đó có một danh sách của môn thể thao

ID thể thao
1 rổ
2 Football
3 Soccer
4 Kickball

Sau đó, bạn sẽ làm một tham gia giữa các bảng

select people.name, sports.sport 
from people, sports 
where people.favsport = sports.ID 

mà sẽ cung cấp cho bạn trở lại

Tên Sport
Alex Kickball
Bóng đá Gnat

Bạn cũng có thể sử dụng tuyên bố trường hợp, ví dụ: chỉ cần sử dụng bảng mọi người từ trên cao, bạn có thể viết một cái gì đó như

select name, 
     case 
     when favsport = 1 then 'Basketball' 
     when favsport = 2 then 'Football' 
     when favsport = 3 then 'Soccer' 
     else 'Kickball' 
     end as "Sport" 
from people 

Nhưng đó chắc chắn không phải là phương pháp hay nhất.

+1

Âm thanh tốt. Thật không may về dự án này tôi đã không được cung cấp khả năng thiết kế hoặc thay đổi cơ sở dữ liệu. Vì vậy, tôi có thể phải đi với tuyên bố trường hợp. Tuy nhiên, bảng tham gia có ý nghĩa hoàn chỉnh. Tôi đã thực sự làm một điều tương tự với PHP, tôi đã tạo ra một hàm mà tôi đã chuyển tên thuộc tính và giá trị. Sau đó nó đã kiểm tra một mảng chỉ mục mà tôi đã tạo để tra cứu chuỗi nào tương ứng với giá trị nào. Vì vậy, về cơ bản giống nhau. Cám ơn phản hồi của bạn. – Cimplicity

+0

Bạn không phải tạo bảng vĩnh viễn. Nó sẽ là tốt nhất nhưng có những lựa chọn thay thế khác, tùy thuộc vào DBMS. Bảng tạm thời, Biểu thức bảng chung, Bảng giá trị Constructors. –

2

Biểu thức CASE có thể hữu ích. Tuy nhiên, nó có thể thậm chí nhanh hơn để có một bảng nhỏ với một khóa chính int và một name chuỗi như

1 baseball 
2 football 

vv, và JOIN nó một cách thích hợp trong truy vấn.

8

MySQL có tuyên bố CASE. Các công trình sau đây trong SQL Server:

SELECT 
    CASE MyColumnName 
     WHEN 1 THEN 'First' 
     WHEN 2 THEN 'Second' 
     WHEN 3 THEN 'Third' 
     ELSE 'Other' 
    END 
+0

Đúng. Nhưng một JOIN vẫn có thể thích hợp hơn (các điểm chuẩn là phải ;-). –

+0

có, nhưng nó không thực sự là cách tiếp cận đúng ở đây. –

1

Bạn có nghĩ hữu ích khi lưu trữ các mối quan hệ này giữa số nguyên và chuỗi trong cơ sở dữ liệu không? Miễn là bạn phải lưu trữ các mối quan hệ này, nó có ý nghĩa để lưu trữ nó gần với dữ liệu của bạn (trong cơ sở dữ liệu) thay vì trong mã của bạn, nơi nó có thể bị mất. Nếu bạn sử dụng giải pháp này, điều này sẽ làm cho số nguyên một khóa ngoài thành giá trị trong bảng khác. Bạn lưu trữ số nguyên trong một bảng khác, giả sử sports, với sport_idsport và tham gia chúng như là một phần của truy vấn của bạn.

Thay vì SELECT * FROM my_table bạn sẽ SELECT * from my_table và sử dụng appropriate join. Nếu không phải mọi hàng trong cột chính của bạn có một môn thể thao tương ứng, bạn có thể sử dụng một phép nối trái, nếu không chọn từ cả hai bảng và sử dụng = trong mệnh đề where có lẽ là đủ.

1

chắc chắn có DB giữ giá trị chuỗi. Tôi không phải là chuyên gia DB bằng bất kỳ phương tiện nào, nhưng tôi khuyên bạn nên tạo một bảng chứa các chuỗi và các giá trị số nguyên tương ứng của chúng. Từ đó, bạn có thể định nghĩa mối quan hệ giữa hai bảng và sau đó thực hiện JOIN trong lựa chọn để kéo phiên bản chuỗi của số nguyên.

tblSport Columns 
------------ 
SportID int (PK, eg. 12) 
SportName varchar (eg. "Tennis") 


tblFriend Columns 
------------ 
FriendID int (PK) 
FriendName (eg. "Joe") 
LikesSportID (eg. 12) 


In this example, you can get the following result from the query below: 
SELECT FriendName, SportName 
FROM tblFriend 
INNER JOIN tblSport 
ON tblFriend.LikesSportID = tblSport.SportID 

Người đàn ông, đã muộn - Tôi hy vọng tôi có quyền đó. bằng cách này, bạn nên đọc trên các loại khác nhau của Joins - đây là ví dụ đơn giản nhất của một.

3

Trong oracle bạn có thể sử dụng chức năng DECODE sẽ cung cấp giải pháp nơi thiết kế cơ sở dữ liệu nằm ngoài tầm kiểm soát của bạn.

enter image description here

Trực tiếp từ oracle documentation:

Ví dụ: Ví dụ này giải mã warehouse_id giá trị. Nếu warehouse_id là 1, thì hàm trả về 'Southlake'; nếu warehouse_id là 2, thì nó trả về 'San Francisco'; và kể từ đó trở đi. Nếu warehouse_id không phải là 1, 2, 3 hoặc 4, thì hàm trả về 'Không nội địa'.

SELECT product_id, 
     DECODE (warehouse_id, 1, 'Southlake', 
          2, 'San Francisco', 
          3, 'New Jersey', 
          4, 'Seattle', 
           'Non domestic') "Location" 
    FROM inventories 
    WHERE product_id < 1775 
    ORDER BY product_id, "Location"; 
Các vấn đề liên quan