2009-04-29 19 views
14

Vì vậy,MySQL Wildcard cho "=" - là có một

SELECT * FROM table WHERE col LIKE '%' 

sẽ trở lại tất cả mọi thứ. Có một ký tự đại diện cho truy vấn

SELECT * FROM table WHERE col = '*' 

Rõ ràng * không làm việc, tôi chỉ cần đặt nó ở đó để chỉ ra nơi tôi muốn một ký tự đại diện. Cột tôi chọn từ chứa số nguyên từ 1 đến 12 và tôi muốn có thể chọn tất cả các bản ghi với một số cụ thể hoặc tất cả bản ghi có ký tự đại diện.

Xin cảm ơn,

Trả lời

11

NHƯ về cơ bản giống như =, ngoại trừ LIKE cho phép bạn sử dụng ký tự đại diện.

Hai truy vấn sẽ trả lại kết quả tương tự:

SELECT * FROM table WHERE col LIKE 'xyz'; 
SELECT * FROM table WHERE col='xyz'; 

Nếu không có một '%' trong truy vấn LIKE, nó là một cách hiệu quả tương tự như '='.

Nếu bạn đang thực hiện lựa chọn trên cột số nguyên, bạn nên cân nhắc sử dụng toán tử IN() hoặc BETWEEN. Có vẻ như bạn có hai điều kiện riêng biệt nên được xử lý trong mã của mình, thay vì trong truy vấn, vì các điều kiện của bạn cho thấy bạn cần ít nhất hai loại truy vấn khác nhau.

Chỉnh sửa: Tôi nên làm rõ rằng LIKE và = chỉ tương tự trong cách sử dụng so sánh chuỗi thông thường, buồn tẻ. Bạn nên kiểm tra MySQL Manual để biết chi tiết về cách hoạt động của nó, vì có những trường hợp không giống nhau (chẳng hạn như bộ ngôn ngữ).

+0

Cảm ơn, chỉ là những gì tôi đang tìm kiếm. Sẽ xử lý nó trong mã và thay đổi truy vấn để bao gồm mệnh đề WHERE cụ thể đó và khi nào cần. – Dan

+0

MySQL có hỗ trợ GIỮA KHÔNG? Tôi nghĩ đó chỉ là TSQL –

+0

@Joe: GIỮA là SQL chuẩn. Tôi chưa bao giờ gặp bất kỳ hệ thống hỗ trợ SQL nào không hỗ trợ BETWEEN. –

7

Lý do sử dụng LIKE là vì = không cung cấp hỗ trợ ký tự đại diện. Nếu không, sẽ không có lý do nào cho LIKE

0
SELECT * FROM table WHERE col RLIKE '.*' 

tức là LIKE biểu thức chính quy.

+0

Cảm ơn bạn đã nhắc tôi về toán tử MySQL tốt đẹp đó. RLIKE aka REGEXP đáng được biết: http://dev.mysql.com/doc/refman/5.1/en/regexp.html – artlung

8

Nếu bạn muốn chọn mọi thứ, tại sao bạn đính kèm mệnh đề WHERE? Chỉ cần để nó ra khỏi tình trạng thay vì đặt một ký tự đại diện vào nó.

+1

Tôi đã nghĩ rằng, sau đó tôi nghĩ, không, đó là vô nghĩa, anh ấy chỉ phải sử dụng ký tự đại diện làm ví dụ và thực sự anh ta sẽ neo văn bản trên một hoặc cả hai mặt của nó. Sau đó, tôi đọc lại câu hỏi một cách chi tiết và không, bạn nói đúng, anh ấy chỉ cần rời khỏi WHERE cho ứng dụng của anh ấy. – chaos

+1

Dan, bạn biết rằng phần WHERE là tùy chọn, phải không? Nếu bạn rời khỏi nó, sau đó bạn sẽ chọn mọi hàng. – allyourcode

0

Giả sử truy vấn của bạn là tham số điều khiển một tuyên bố trường hợp có lẽ là thích hợp

select * from mytable 
where col like case when @myvariable is null then % else myvariable end 

đâu @myvariable là một trong hai null nếu bạn không muốn có một giá trị nếu không nó sẽ sử dụng các giá trị số nguyên bạn vượt qua trong.

0

Câu trả lời của zombat thật tuyệt vời, nhưng tôi chỉ nhận thấy trong câu trả lời của anh ấy rằng bạn đang chọn số nguyên. Ông đã đề cập đến IN() và GIỮA(). Dưới đây là các ví dụ sử dụng các cú pháp đó, cũng như một số tùy chọn khác mà bạn có cho trường số nguyên.

SELECT * FROM table WHERE col = 1; 
SELECT * FROM table WHERE col BETWEEN 1 AND 12; 
SELECT * FROM table WHERE col BETWEEN 6 AND 12; 
SELECT * FROM table WHERE col <= 6; 
SELECT * FROM table WHERE col < 6; 
SELECT * FROM table WHERE col >= 6; 
SELECT * FROM table WHERE col > 6; 
SELECT * FROM table WHERE col <> 6; 
SELECT * FROM table WHERE col IN (1,2,5,6,10); 
SELECT * FROM table WHERE col NOT IN (1,2,5,6,10); 
0

Tôi đã gặp một trường hợp như vậy trong khi xây dựng một thủ tục lưu trữ cho một báo cáo Sau đây là giải pháp của tôi, hy vọng điều này là những gì bạn có trong tâm trí :)

set @p = "ALL"; 

Query:

select * from fact_orders 
where 
dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p) 
limit 10 
; 
0

Nếu giá trị của bạn nằm trong phạm vi (1,12) thì:

chọn * fro m bảng nơi col> = 5 và col < = 5; // số này bằng col = 5

chọn * từ bảng trong đó col> = 0 và col < = 12; // giá trị này bằng col = bất kỳ giá trị nào

Cùng một dòng có thể tạo ra cả hai hiệu ứng bằng cách chọn 2 tham số phù hợp. Tôi phải đối mặt với một vấn đề tương tự khi tôi cần một câu lệnh chuẩn bị duy nhất nên làm việc với 2 cách khác nhau, hoặc kiểm tra một giá trị cụ thể trong một cột hoặc bỏ qua cột đó hoàn toàn.

Các vấn đề liên quan