MySQL SELECTはnull値ではありません


264

NOT NULL値のみを取るselectステートメントを実行することは可能ですか?

今私はこれを使っています:

SELECT * FROM table

そして、phpループでnull値をフィルターで取り除く必要があります。

行う方法はありますか:

SELECT * (that are NOT NULL) FROM table

現在、*を選択すると、val1、val2、val3、null、val4、val5、null、nullなどを取得しますが、結果でnullでない値を取得したいだけです。ループでフィルタリングせずにこれは可能ですか?


2
一部の列にNULL値があり、他の列にはNULL値がない行がある場合、どうしますか?
Mark Byers、2011年

nullではない列から値のみを取得し、nullでない行の列値のみを返したいのですが。現在、ループを使用してそれらを除外していますが、ループなしでそれを行うことは可能ですか?
ブライアンsammon

1
@bryan-あなたのテーブル構造は何ですか?すべての列に同じデータ型がありますか?
マーティン・スミス、

1
@bryan-では、理想的な結果セットはどのようになるでしょうか?null以外のすべての値を含む1列の結果セット?例のデータと希望する結果で質問を編集しないと役立つでしょう...
Martin Smith

2
@bryan-それはあなたのテーブルが列全体に繰り返しグループを持っているように思えますか?(説明と、代替の構造については、Wikiの記事を参照してください。その場合は、en.wikipedia.org / wiki / First_normal_formを参照してください)
Martin Smith

回答:


453

使用する必要がありますIS NOT NULL。(比較演算子=<>の両方ギブUNKNOWNNULL発現のいずれかの側に)。

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

完全を期すために、MySQLではnullセーフ等価演算子を無効にすることもできますが、これは標準SQLではありません。

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

コメントを反映するように編集されました。テーブルが最初の通常の形式ではない可能性があります。その場合、構造を変更するとタスクが簡単になる可能性があります。それを行う他の方法のいくつか...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

上記の欠点は、テーブルを各列に対して1回ずつスキャンすることです。これはおそらく以下で回避できるかもしれませんが、MySQLではテストしていません。

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
どうも

最後のアプローチでは、関数CASEではなくステートメントを使用しましたCASE。だから、それ は部分のEND CASE代わりではないのですか?ENDSELECT CASE ...
Istiaque Ahmed 2017

それほど専門家ではない人のために、最後の解決策を説明できますか?idx 最初のROM は2番目のROM SELECTからのものですか?ステートメントは何を達成しようとしますか?秒は実際には何をしますか?そして、クロス結合ではなく、内部結合を行っていますよね?idxSELECTCASESELECT
Istiaque Ahmed 2017

これが質問に答えるとは思いません。OPが(特定の1つの行を)行を選択したが、その結果からnullであったすべての列を除外したいようです-この回答では、nullにできない列を指定する必要があります(これはまったく別の問題です)またはすべての列を指定します。多くの列を持つテーブルには適していません
csey

(例:の線に沿ったものSELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue"
csey 2018年

18

特定の列にNULL値を含む行を除外できます。

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

列にnullを含む行をフィルターで除外する場合は、次のようにしてください。

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

更新:コメントに基づいて、おそらくこれが必要ですか?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

そして、私はマーティンと怒り、あなたがこれをする必要があるなら、あなたはおそらくあなたのデータベース設計を変えるべきだと思います。


私はそれを十分に説明したかどうかはわかりませんが、もう少し上手くやろうと思います。現在、*を選択すると、val1、val2、val3、null、val4、val5、null、nullなどを取得しますが、結果でnull以外の値を取得したいだけです。ループでフィルタリングせずにこれは可能ですか?
ブライアン・サモン

@bryan-どの列*が返されるか説明してくれませんか?これがすべて1つの列であるかどうかの上記のコメントからは明確ではないため、質問に少し例のデータを提供する可能性があります。
マーティン・スミス

現在、*は行のすべての値を返します。つまり、val1、val2、val3、null、val4、val5、null、nullです。しかし、私はそれがnullではない列の値のみを返すようにしたいです。現在は、結果を返した後で値をフィルターで除外するループを使用しています。
ブライアンサモン

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

このアプローチの唯一の欠点は、5つの列しか比較できないことです。その後、結果は常にfalseになるため、可能なフィールドのみを比較しますNULL


8

私はこの解決策を見つけました:

このクエリは、各列に対してnullではない最後の値を選択します。


テーブルがある場合:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

あなたが得る:

title|body
t3   |b2

クエリ


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

お役に立てば幸いです。


GROUP_CONCAT(body)AS body
Ravindra Singh

2

\!MySQL内のコマンドを使用して、シェルからNULL値をgrepします。

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

.my.cnfデータベース/ユーザー名/パスワードが指定されている適切な環境で最適に機能します。そうすれば、select\! mysql eで囲む必要があります| grep -v NULL


1

私のために働いている次のクエリ

列「NULL」のデフォルト値を設定した場合

select * from table where column IS NOT NULL

そして私がデフォルト値を設定したときは何もしません

select * from table where column <>''


0

MYSQLは、結合と選択、挿入、削除、論理演算子と同様にNULLではなく、またはNOT

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

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