MySQL chọn nơi cột không trống


182

Trong MySQL, tôi chỉ có thể chọn các cột khi có thứ gì đó tồn tại?

Ví dụ: tôi có truy vấn sau:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

Tôi đang cố gắng chỉ chọn các hàng có điện thoại bắt đầu bằng 813 và phone2 có thứ gì đó trong đó.


2
Bạn có thể làm rõ những gì bạn có nghĩa là " phone2có một cái gì đó trong đó?" Mọi người đang đoán xem liệu bạn có nghĩa phone2là KHÔNG PHẢI, không trống, không chỉ là khoảng trắng, v.v.
hương

1
nếu "một cái gì đó" tồn tại, nó rõ ràng không phải là null.
mike

Câu trả lời:


277

So sánh giá trị của phone2với chuỗi rỗng:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Lưu ý rằng NULLgiá trị được hiểu là false.


5
Dấu ngoặc đơn, không dấu ngoặc kép.
Ngựa Non OMG

2
phone2<>""sẽ không vượt qua bất kỳ trình kiểm tra cú pháp SQL nào.
Ngựa Non OMG

5
@OMG Ponies: Nhưng nó hoạt động trong mysql. Đây là công cụ kiểm tra duy nhất có vấn đề
Ivan Nevostruev

7
@ivan: Tin cho tôi, xin lỗi về điều đó.
Ngựa Non OMG

<> giống như! =. nó thật đơn giản nhưng tôi không biết :)
MFarooqi

48

Để kiểm tra xem trường có sử dụng NULL không IS NULL, IS NOT NULLtoán tử.

Tài liệu tham khảo MySql http://dev.mysql.com/doc/refman/5.0/en/usiness-with-null.html


10
OP đang hỏi về chỉ những hàng có thứ gì đó trong trường phone2. ISLL NULL trả về mọi thứ theo nghĩa đen không được đặt thành NULL, ngay cả chuỗi trống "". ! = '' hoặc <> '' như Ivan đã nói trong câu trả lời được chấp nhận, sẽ không trả về các chuỗi rỗng hoặc giá trị NULL. Nói cách khác, IS NOT NULL là tập con của! = '', Nhưng chúng không tương đương.
Không có

34

Kiểm tra NULLvà giá trị chuỗi trống:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

NB Tôi nghĩ COALESCE () là tiêu chuẩn SQL (-ish), trong khi ISNULL () thì không.


1
Bạn không cần sử dụng hàm trim, vì trong MySQL, một chuỗi có số lượng khoảng trắng bằng với một chuỗi khoảng trống khác, tôi đã viết câu trả lời về điều này trong một số chi tiết khá chi tiết stackoverflow.com/a/ 42723975/728236
Brian Leishman

25

Một câu trả lời mà tôi đã sử dụng đã làm việc cho tôi khá tốt mà tôi chưa thấy ở đây (câu hỏi này rất cũ, vì vậy nó có thể không hoạt động sau đó) thực sự là

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

Lưu ý > ''phần này sẽ kiểm tra xem giá trị không phải là null và nếu giá trị không chỉ là khoảng trắng hoặc trống.

Về cơ bản, nếu trường có một cái gì đó trong nó ngoài khoảng trắng hoặc NULL, thì đó là sự thật. Nó cũng siêu ngắn, vì vậy nó dễ dàng để ghi, và một cộng trong COALESCE()IFNULL()chức năng là điều này là chỉ số thân thiện, vì bạn đang không so sánh sản lượng của một hàm trên một lĩnh vực để bất cứ điều gì.

Các trường hợp thử nghiệm:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

CẬP NHẬT Có một sự cảnh báo về điều này mà tôi không mong đợi, nhưng các giá trị số bằng 0 hoặc thấp hơn không lớn hơn một chuỗi trống, vì vậy nếu bạn đang xử lý các số có thể bằng 0 hoặc âm thì KHÔNG LÀM NÀY , nó cắn tôi rất gần đây và rất khó gỡ lỗi :(

Nếu bạn đang sử dụng các chuỗi (char, varchar, text, v.v.), thì điều này sẽ hoàn toàn ổn, chỉ cần cẩn thận với số.


17

Nếu có khoảng trắng trong trường phone2 từ mục nhập dữ liệu vô ý, bạn có thể bỏ qua các bản ghi đó với các hàm IFNULL và TRIM:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

Bạn không cần sử dụng hàm trim, vì trong MySQL, một chuỗi có số lượng khoảng trắng bằng với một chuỗi khoảng trống khác, tôi đã viết câu trả lời về điều này trong một số chi tiết khá chi tiết stackoverflow.com/a/ 42723975/728236
Brian Leishman

7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

6
Lưu ý rằng có một sự khác biệt giữa một NULLgiá trị và một chuỗi rỗng '' một giá trị. Nếu bạn muốn kiểm tra đối với một chuỗi trống, hãy sử dụng column <> ''theo đề xuất của các câu trả lời khác.
Dzhuneyt

7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

Có thể cần một số điều chỉnh tùy thuộc vào giá trị mặc định của bạn là gì. Nếu bạn cho phép Null điền, thì bạn có thể thực hiện "Không phải NULL", điều này rõ ràng là tốt hơn.


Tôi sẽ không đánh dấu bạn nhưng: 1) Không có NOT()chức năng nào trong MySQL 2) phone2=""sẽ không vượt qua bất kỳ trình kiểm tra cú pháp SQL nào.
Ngựa Non OMG

1
Heh, xin lỗi. Tôi sử dụng rất nhiều máy chủ SQL khác nhau.
Satanicpuppy

2

Chúng ta có thể sử dụng CASE để đặt giá trị trống cho một số char hoặc String. Tôi đang sử dụng NA làm chuỗi mặc định.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

2

Một cách khác là xem xét cụ thể CHAR_LENGTHcác giá trị cột. (đừng nhầm lẫn với LENGTH)

Sử dụng một tiêu chí trong đó độ dài ký tự lớn hơn 0, sẽ tránh được kết quả dương tính giả khi các giá trị cột có thể là falsey, chẳng hạn như trong trường hợp cột số nguyên có giá trị là 0hoặc NULL. Hành xử nhất quán hơn trên các loại dữ liệu khác nhau.

Điều này dẫn đến bất kỳ giá trị nào dài ít nhất 1 ký tự hoặc không trống.

Ví dụ https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Bảng dữ liệu

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0Kết quả (giống nhau)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

Lựa chọn thay thế

phone2 <> ''Kết quả (khác nhau)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Kết quả (khác nhau)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Kết quả (giống nhau)
Lưu ý: kết quả khác với phone2 IS NOT NULL AND phone2 <> ''dự kiến

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Kết quả (khác nhau)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

1

Sử dụng:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

1
Tôi nhận thấy rằng đôi khi IS NOT NULLkhông được áp dụng cho các cột chỉ chuỗi có giá trị trống ( ''). Tôi không biết tại sao, nhưng chỉ muốn chỉ ra điều đó. Sẽ khôn ngoan hơn t.phone2 <> ''khi sử dụng khi kiểm tra các cột chuỗi trống.
Dzhuneyt

1

Đáng ngạc nhiên (như không ai khác đã đề cập trước đó) thấy rằng điều kiện dưới đây thực hiện công việc:

WHERE ORD(field_to_check) > 0 

khi chúng ta cần loại trừ cả hai giá trị null và rỗng. Có ai biết những nhược điểm của phương pháp này không?


0

bạn có thể sử dụng như ký tự đại diện toán tử để đạt được điều này:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

bằng cách này, bạn có thể nhận được tất cả phone2 có tiền tố số.


0

Trong trường hợp của tôi, tôi đã có một cột varchar, cả hai phương pháp IS NOT NULL& != '' không hoạt động , nhưng các phương pháp sau đây có hiệu quả với tôi. Chỉ cần đặt cái này ra đây.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
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.