MySQLは列が空でない場所を選択します


182

MySQLでは、何かが存在する場所でのみ列を選択できますか?

たとえば、次のクエリがあります。

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

phoneが813で始まり、phone2に何かが含まれている行のみを選択しようとしています。


2
phone2何かがある」とはどういう意味ですか?phone2IS NOT NULL、空白ではない、空白文字だけではない、などと人々は推測しています
pilcrow '08 / 12/12

1
「何か」が存在する場合、それは明らかにnullではありません。
マイク、

回答:


277

の値phone2を空の文字列と比較します。

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

NULL値はと解釈されることに注意してくださいfalse


5
二重引用符ではなく、単一引用符。
OMGポニー

2
phone2<>""SQL構文チェッカーを通過しません。
OMGポニー

5
@OMGポニー:しかし、mysqlで動作します。これが問題となる唯一のチェッカーです
Ivan Nevostruev

7
@ivan:すみません、ニュースです。
OMGポニー

<>は!=と同じです。簡単でした。しかし、私は知りませんでした:)
MFarooqi

48

フィールドがNULLかどうかを確認するにはIS NULL、を使用します。IS NOT NULL演算子を。

MySqlリファレンスhttp://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
OPは、phone2フィールドに何かがある行のみについて質問しています。IS NOT NULLは、空の文字列 ""であっても、文字通りNULLに設定されていないすべてのものを返します。!= ''または<> ''は、受け入れられた回答でIvanが述べたように、空の文字列やNULL値を返しません。つまり、IS NOT NULLは!= ''のサブセットですが、同等ではありません。
なし

34

NULL空の文字列値を確認します。

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

注意: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でないかどうか、および値が空白や空白でないかどうかをチェックする部分に注意してください。

基本的に、フィールドに空白や以外の何かが含まれている場合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

UPDATEがあり、私は期待していなかったことをこれに警告があるが、ゼロ以下ある数値がありません空の文字列よりも大きいので、あなたはしているが、ゼロまたは負その後、DO NOT DO THISできる数字を扱う場合には、それはごく最近私に噛み付き、デバッグするのが非常に困難でした:(

文字列(char、varchar、textなど)を使用している場合は、これで十分です。数値に注意してください。


17

不注意なデータエントリのphone2フィールドにスペースがある場合は、IFNULL関数とTRIM関数を使用してそれらのレコードを無視できます。

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

MySQLでは任意の数のスペースの文字列が任意の数のスペースの別の文字列と等しいため、トリム関数を使用する必要はありません。詳細については、stackoverflow.com /
ブライアンリーシュマン

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

6
差があることに注意してくださいNULL値と空の文字列である値。空の文字列をチェックする場合は、他の回答で提案されているように使用します。''column <> ''
Dzhuneyt 2013

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

デフォルト値が何であるかによって、多少の調整が必要になる場合があります。Nullフィルを許可した場合は、代わりに「Not NULL」を実行できます。これは明らかに優れています。


マークダウンしませんが、1)NOT()MySQLには機能がありません。2)phone2=""SQL構文チェッカーを通過しません。
OMGポニー

1
あ、ごめんなさい。さまざまなSQLサーバーを使用しています。
Satanicpuppy 2009

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 

null値と空の値の両方を除外する必要がある場合。誰かがアプローチの欠点を知っていますか?


構文を正しくするために何時間も努力してきましたが、これですべてが解決されました!
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 <> ''空の文字列列をチェックするときに使用する方が賢明です。
Dzhuneyt 2013年

0

like演算子のワイルドカードを使用してこれを実現できます。

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

このようにして、番号のプレフィックスを持つすべてのphone2を取得できます。


0

私の場合、IS NOT NULL&の両方の方法が機能!= '' しなかったvarchar列がありましたが、次の方法でうまくいきました。これをここに置くだけです。

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.