MySQL выбирает, где столбец не пуст

В MySQL я могу выбрать столбцы только там, где что-то существует?

Например, у меня есть следующий запрос:

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

Я пытаюсь выбрать только строки, где начинается телефон с 813, а у телефона2 есть что-то.

Ответ 1

Сравнить значение phone2 с пустой строкой:

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

Обратите внимание, что значение NULL интерпретируется как false.

Ответ 3

Проверить NULL и пустые строки:

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

N.B. Я думаю, COALESCE() является стандартом SQL (-ish), тогда как ISNULL() не является.

Ответ 4

Если в поле phone2 есть пробелы из вложенных данных, вы можете игнорировать эти записи с помощью функций IFNULL и TRIM:

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

Ответ 5

Ответ, который я использовал, который работал для меня довольно хорошо, который я уже не видел здесь (этот вопрос очень старый, поэтому он, возможно, не работал тогда), на самом деле

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 и т.д.), То это будет прекрасно, просто будьте осторожны с числами.

Ответ 6

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

Ответ 7

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

Может потребоваться некоторая настройка в зависимости от вашего значения по умолчанию. Если вы разрешили Null fill, тогда вы можете сделать "Not NULL", что явно лучше.

Ответ 8

Мы можем использовать 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%'

Ответ 9

Использование:

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

Ответ 10

вы можете использовать подобный шаблон оператора для достижения этого:

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

таким образом вы можете получить весь телефон2 с префиксом числа.

Ответ 11

В моем случае у меня был столбец varchar, оба метода IS NOT NULL & != '' Не работали, но у меня сработало следующее. Просто выкладываю это здесь.

SELECT * FROM 'db_name' WHERE 'column_name' LIKE '%*%'

Ответ 12

Еще одна альтернатива - посмотреть на 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