9

特定の列に空白/nullデータがあるレコードを含むテーブルがあり、非常に長いSQLステートメントを作成せずに、すべての列の値が空白/null以外のレコードを検索したいと思います。

例えば:

SELECT * FROM table
WHERE col1 IS NOT NULL AND col2 IS NOT NULL AND col3 IS NOT NULL AND...

これを短縮する方法はありますか?または、これを別の方法で行う方法はありますか(SQLプロシージャを使用する場合がありますか?)

4

8 に答える 8

8

それを短くするために私がする唯一のことは、次のようなことをすることです:

SELECT * FROM table1 WHERE (val1 AND val2 AND val3 AND val4) IS NOT NULL

于 2012-07-11T18:27:01.407 に答える
5

すべての列のデータを含む行のみを確認したい場合は、上記で投稿したクエリに基づいてビューを作成することをお勧めします。そうすれば、よりエレガントで短い方法でそれを操作できます。

ビューは、クエリに基づく一種の「仮想テーブル」です。ある種の複雑な結合またはフィルタリングを定期的に実行したい場合は、ビューを使用すると、他の場所に書き込む必要のあるクエリを大幅に簡素化できます。

于 2012-07-11T18:30:51.360 に答える
1

すべての列のISNULL関数を合計します。

SELECT * FROM table1 WHERE
ISNULL(val1)+ISNULL(val2)+ISNULL(val3)+ISNULL(val4)=0;

合計が0の場合、すべての列にデータがあります

テストするテーブルの列が多すぎてチェックできない場合、入力するのが非常に面倒な場合は、INFORMATION_SCHEMA.COLUMNを使用してクエリを作成します。

次のようなtest.mytableというテーブルを作成します。

mysql> show create table test.mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '',
  `language` varchar(12) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10) unsigned NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `vid` (`vid`),
  KEY `node_changed` (`changed`),
  KEY `node_created` (`created`),
  KEY `node_moderate` (`moderate`),
  KEY `node_promote_status` (`promote`,`status`),
  KEY `node_status_type` (`status`,`type`,`nid`),
  KEY `node_title_type` (`title`,`type`(4)),
  KEY `node_type` (`type`(4)),
  KEY `uid` (`uid`),
  KEY `tnid` (`tnid`),
  KEY `translate` (`translate`)
) ENGINE=InnoDB AUTO_INCREMENT=73798 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

次のステートメントを使用して、このテーブルのクエリを生成できます

SET @MyDB = 'test';
SET @MyTB = 'mytable';
SELECT CONCAT(GROUP_CONCAT(CONCAT('ISNULL(',column_name,')') SEPARATOR '+'),'=0')
INTO @WhereClause FROM information_schema.columns
WHERE table_schema=@MyDB AND table_name=@MyTB;
SET @SQLStmt = CONCAT('SELECT * FROM ',@MyDB,'.',@MyTB,' WHERE ',@WhereClause);
SELECT @SQLStmt\G

それらのステートメントを実行して、どのSQLが生成されるかを見てみましょう

mysql> SET @MyDB = 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @MyTB = 'mytable';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CONCAT(GROUP_CONCAT(CONCAT('ISNULL(',column_name,')') SEPARATOR '+'),'=0')
    -> INTO @WhereClause FROM information_schema.columns
    -> WHERE table_schema=@MyDB AND table_name=@MyTB;
Query OK, 1 row affected (0.00 sec)

mysql> SET @SQLStmt = CONCAT('SELECT * FROM ',@MyDB,'.',@MyTB,' WHERE ',@WhereClause);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @SQLStmt\G
*************************** 1. row ***************************
@SQLStmt: SELECT * FROM test.mytable WHERE ISNULL(nid)+ISNULL(vid)+ISNULL(type)+ISNULL(language)+ISNULL(title)+ISNULL(uid)+ISNULL(status)+ISNULL(created)+ISNULL(changed)+ISNULL(comment)+ISNULL(promote)+ISNULL(moderate)+ISNULL(sticky)+ISNULL(tnid)+ISNULL(translate)=0
1 row in set (0.00 sec)

mysql>

そこから、SQLを使用してSQLを実行するPREPAREか、SQLをPHPに渡します。mysql_query

于 2012-07-11T18:35:34.183 に答える
0

それを行う別の方法は

SELECT * FROM table1 WHERE val1 AND val2 AND val3 AND val4 is <> '';

これは少し短いかもしれません。引用符の間にスペースがないことを確認してください。

于 2012-07-11T18:30:49.917 に答える
0

以下のような列を追加する別の方法

SELECT * 
FROM table1 
WHERE (val1 + val2 + val3) IS NOT NULL

いずれかの列が文字データ型でない場合、その列はキャスト関数を使用してcharに変換する必要があります

于 2012-07-11T18:46:32.510 に答える
0

それを短縮する方法はありませんが、以下のクエリで任意のテーブルの汎用にすることができます。

DECLARE @tb NVARCHAR(255) = N'table1';

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + @tb
    + ' WHERE 1 = 1';

SELECT @sql += N' AND ' + QUOTENAME(name) + ' IS NOT NULL'
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb);

EXEC sp_executesql @sql;

'table1'をクエリ対象のテーブルの名前に置き換えると、結果が得られます。

基本的に、この動的SQLはsys.columnsテーブルにクエリを実行して、テーブルに属するすべての列を取得し、それにIS NOT NULL条件を追加します。

于 2012-11-19T09:34:30.807 に答える
0
SELECT *
FROM table1
WHERE CONCAT(val1, val2, val3, ...) is not Null
于 2012-11-19T09:43:53.843 に答える
0
SELECT * FROM YOUR_TABLE where ((select REPLACE(WM_CONCAT(distinct COLUMN_NAME),',',' IS NOT NULL AND ') from all_tab_columns where OWNER = 'OWNER_DEV' and TABLE_NAME = 'YOUR_TABLE' ||'is not null' )) is not null;

必ず変更してください:

  >> 1- YOUR_TABLE   by   the name of your table                                             
  >> 2- OWNER_DEV    by   the name of your owner

于 2014-06-18T16:07:15.023 に答える