Виберіть MySQL, де стовпець не порожній


182

Чи можу я вибирати стовпці в MySQL лише там, де щось є?

Наприклад, у мене є такий запит:

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

Я намагаюся вибрати лише ті рядки, де телефон починається з 813, а телефон2 має щось у ньому.


2
Чи можете ви уточнити, що ви маєте на увазі під " phone2щось має в ньому?" Люди гадають, чи маєте ви на увазі phone2НЕ НУЛЬНИЙ, не порожній, це не виключно пробіл та інше
pilcrow

1
якщо "щось" існує, воно, очевидно, не є нульовим.
Майк

Відповіді:


277

Порівняйте значення phone2порожнього рядка:

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

Зауважте, що NULLзначення трактується як false.


5
Одиночні цитати, а не подвійні.
OMG Ponies

2
phone2<>""не зробить його минулим жодної перевірки синтаксису SQL.
OMG Ponies

5
@OMG Ponies: Але це працює в mysql. Це єдина перевірка, яка має значення
Іван Невоструєв

7
@ivan: Новини мені, шкода про це.
OMG Ponies

<> те саме, що! =. це було просто. але я не знав :)
MFarooqi

48

Щоб перевірити, чи є поле NULL IS NULL, IS NOT NULLоператори.

Посилання на MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
ОП запитує лише про рядки, у яких є щось у полі phone2. НЕ NULL повертає все, що буквально не встановлено на NULL, навіть порожній рядок "". ! = '', або <> '', як сказав Іван у прийнятій відповіді, не поверне порожні рядки або значення NULL. Іншими словами НЕ NULL - це підмножина! = '', Але вони не еквівалентні.
Немає

34

Перевірка NULLта порожнє значення рядків:

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

NB Я думаю, що COALESCE () є стандартом SQL (-ish), тоді як ISNULL () - ні.


1
Вам не потрібно використовувати функцію обрізки, оскільки в MySQL рядок будь-якої кількості пробілів дорівнює іншій рядку будь-якої кількості пробілів, я відповів на це досить детально stackoverflow.com/a/ 42723975/728236
Брайан Лейшман

26

Відповідь, яку я використовую, працює для мене досить добре, що я вже не бачив тут (це питання дуже старе, тому воно, можливо, не спрацювало тоді) насправді

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

Зауважте > '' частину, яка перевірить, чи значення не є нульовим, і якщо значення не є просто пробілом чи порожнім.

В основному, якщо в полі є щось інше, ніж пробіл, або NULLце правда. Це також дуже коротко, тому легко писати та ще один плюс над COALESCE()іIFNULL() функціями є те, що це індексує, оскільки ви не порівнюєте вихід функції з поля ні з чим.

Тестові приклади:

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

ОНОВЛЕННЯ Існує застереження до цього, якого я не очікував, але числові значення, що дорівнюють нулю або нижче, не перевищують порожній рядок, тому якщо ви маєте справу з числами, які можуть бути нульовими або негативними, то НЕ робіть цього , це мене покусало зовсім недавно і було дуже важко налагоджувати :(

Якщо ви використовуєте рядки (char, varchar, text тощо), то це буде цілком добре, просто будьте обережні з числовими цифрами.


17

Якщо в полі phone2 є пробіли від ненавмисного введення даних, ви можете ігнорувати ці записи за допомогою функцій IFNULL та TRIM:

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

Вам не потрібно використовувати функцію обрізки, оскільки в MySQL рядок будь-якої кількості пробілів дорівнює іншій рядку будь-якої кількості пробілів, я відповів на це досить детально stackoverflow.com/a/ 42723975/728236
Брайан Лейшман

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

6
Зауважте, що існує різниця між NULLзначенням і порожнім рядком, ''який є значенням. Якщо ви хочете перевірити наявність порожнього рядка, використовуйте, column <> ''як пропонують інші відповіді.
Джунейт

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

Можливо, знадобиться певна настройка залежно від значення, яке використовується за замовчуванням. Якщо ви дозволили заповнити Null, ви можете замість цього зробити "Not NULL", що, очевидно, краще.


Я не відзначаю вас, але: 1) У NOT()MySQL немає жодної функції) phone2=""не буде проходити жодної перевірки синтаксису SQL.
OMG Ponies

1
Хе, вибач. Я використовую безліч різних SQL-серверів.
Satanicpuppy

2

Ми можемо використовувати CASE для встановлення порожнього значення на деякий char або String. Я використовую NA як рядок за замовчуванням.

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

2

Іншою альтернативою є конкретно CHAR_LENGTHрозглянути значення стовпців. (не плутати зLENGTH )

Використання критеріїв, коли довжина символу перевищує 0, дозволить уникнути помилкових позитивних результатів, коли значення стовпців можуть бути фальсифікованими, наприклад у випадку цілого стовпця зі значенням 0абоNULL . Більш послідовно поводиться в різних типах даних.

Це призводить до будь-якого значення, яке становить принаймні 1 символ або іншим чином не порожнє.

Приклад https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

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

Дані таблиці

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) > 0Результати (однакові)

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

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

Альтернативи

phone2 <> ''Результати (різні)

users
813-123-4567       | 1

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

phone2 > ''Результати (різні)

users
813-123-4567       | 1

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

COALESCE(phone2, '') <> '' Результати (ті ж)
Примітка: результати відрізняються від тих, phone2 IS NOT NULL AND phone2 <> ''яких не очікується

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

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

phone2 IS NOT NULL AND phone2 <> ''Результати (різні)

users
813-123-4567       | 1

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

2

Дивно (як ніхто раніше про це не згадував) виявив, що наведена нижче умова виконує цю роботу:

WHERE ORD(field_to_check) > 0 

коли нам потрібно виключити і нульові, і порожні значення. Хтось знає про недоліки підходу?


я годинами намагався виправити синтаксис, і це просто вирішило все завдяки!
demo7up

1

Використання:

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

1
Я помітив, що іноді IS NOT NULLне застосовується до рядків лише стовпців із порожніми значеннями ( ''). Я не знаю чому, але просто хотів це зазначити. Розумніше використовувати t.phone2 <> ''під час перевірки на порожні стовпці рядків.
Джунейт

0

ви можете використовувати подібні підказки оператора, щоб досягти цього:

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

таким чином, ви можете отримати весь телефон2, який має префікс номера.


0

У моєму випадку я мав колонку varchar, обидва методи IS NOT NULL& != '' не працювали , але наступне працювало для мене. Просто виклавши це тут.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.