In MySQL, can I select columns only where something exists?
For example, I have the following query:
select phone, phone2
from jewishyellow.users
wh
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone like '813%' and (phone2 <> "");
May need some tweakage depending on what your default value is. If you allowed Null fill, then you can do "Not NULL" instead, which is obviously better.
you can use like operator wildcard to achieve this:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 like '[0-9]';
in this way, you could get all phone2 that have a number prefix.
Surprisingly(as nobody else mentioned it before) found that the condition below does the job:
WHERE ORD(field_to_check) > 0
when we need to exclude both null and empty values. Is anybody aware of downsides of the approach?
Use:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
Check for NULL
and empty string values:
select phone
, phone2
from users
where phone like '813%'
and trim(coalesce(phone2, '')) <>''
N.B. I think COALESCE() is SQL standard(-ish), whereas ISNULL() is not.
An answer that I've been using that has been working for me quite well that I didn't already see here (this question is very old, so it may have not worked then) is actually
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 > ''
Notice the > ''
part, which will check if the value is not null, and if the value isn't just whitespace or blank.
Basically, if the field has something in it other than whitespace or NULL
, it is true. It's also super short, so it's easy to write, and another plus over the COALESCE()
and IFNULL()
functions is that this is index friendly, since you're not comparing the output of a function on a field to anything.
Test cases:
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
UPDATE There is a caveat to this that I didn't expect, but numerical values that are zero or below are not greater than a blank string, so if you're dealing with numbers that can be zero or negative then DO NOT DO THIS, it bit me very recently and was very difficult to debug :(
If you're using strings (char, varchar, text, etc.), then this will be perfectly be fine, just be careful with numerics.