Ответ 1
Сравнить значение phone2
с пустой строкой:
select phone, phone2
from jewishyellow.users
where phone like '813%' and phone2<>''
Обратите внимание, что значение NULL
интерпретируется как false
.
В MySQL я могу выбрать столбцы только там, где что-то существует?
Например, у меня есть следующий запрос:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
Я пытаюсь выбрать только строки, где начинается телефон с 813, а у телефона2 есть что-то.
Сравнить значение phone2
с пустой строкой:
select phone, phone2
from jewishyellow.users
where phone like '813%' and phone2<>''
Обратите внимание, что значение NULL
интерпретируется как false
.
Чтобы проверить, является ли поле NULL, используйте операторы IS NULL
, IS NOT NULL
.
Ссылка на MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
Проверить NULL
и пустые строки:
select phone
, phone2
from users
where phone like '813%'
and trim(coalesce(phone2, '')) <>''
N.B. Я думаю, COALESCE() является стандартом SQL (-ish), тогда как ISNULL() не является.
Если в поле phone2 есть пробелы из вложенных данных, вы можете игнорировать эти записи с помощью функций IFNULL и TRIM:
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
AND TRIM(IFNULL(phone2,'')) <> '';
Ответ, который я использовал, который работал для меня довольно хорошо, который я уже не видел здесь (этот вопрос очень старый, поэтому он, возможно, не работал тогда), на самом деле
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 и т.д.), То это будет прекрасно, просто будьте осторожны с числами.
select phone, phone2 from jewishyellow.users
where phone like '813%' and phone2 is not null
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone like '813%' and (phone2 <> "");
Может потребоваться некоторая настройка в зависимости от вашего значения по умолчанию. Если вы разрешили Null fill, тогда вы можете сделать "Not NULL", что явно лучше.
Мы можем использовать 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%'
Использование:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
вы можете использовать подобный шаблон оператора для достижения этого:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 like '[0-9]';
таким образом вы можете получить весь телефон2 с префиксом числа.
В моем случае у меня был столбец varchar, оба метода IS NOT NULL
& != ''
Не работали, но у меня сработало следующее. Просто выкладываю это здесь.
SELECT * FROM 'db_name' WHERE 'column_name' LIKE '%*%'
Еще одна альтернатива - посмотреть на CHAR_LENGTH
значений столбцов. (не путать с LENGTH
)
Использование критерия, где длина символа больше 0, позволит избежать ложных срабатываний, если значения столбца могут быть ложными, например, в случае целочисленного столбца со значением 0
или NULL
. Более последовательное поведение в разных типах данных.
В результате получается любое значение длиной не менее 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