-1

列の値が null にならないように、テーブルの行を取得したいと考えています。列値のハードコーディングはありません。私は何百もの列名を持っています。

ここに画像の説明を入力

すべての行にすべての列の値があるため、出力は行 2 のみである必要があります。is not null のすべての列名を指定したくありません。プログラムで取得する必要があります。新しい列を追加しても、クエリを変更せずに機能するはずです。それが私のビジョンです。

4

5 に答える 5

2

私は何かを見つけましたが、それはCURSORを使用することを意味します

DECLARE @ColumnName VARCHAR(200)
DECLARE @ColumnCount INT
DECLARE @sql VARCHAR(400)

CREATE TABLE #tempTable (Id INT)

DECLARE GetNonNullRows CURSOR 
FOR 
    SELECT c.NAME, (SELECT COUNT(*) FROM sys.columns col WHERE col.object_id = c.OBJECT_ID)  FROM sys.tables AS t
    JOIN sys.columns AS c ON t.object_id = c.object_id
    WHERE t.name = 'SomeTable' AND t.type = 'U'

OPEN GetNonNullRows
FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'SELECT st.UniqueId FROM SomeTable AS st WHERE ' + CONVERT(varchar, @ColumnName) + ' IS NOT NULL'    
    INSERT INTO #tempTable
    EXEC (@sql)

FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
END 

CLOSE GetNonNullRows
DEALLOCATE GetNonNullRows

SELECT * FROM SomeTable AS st1
WHERE st1.UniqueId IN (SELECT Id FROM #tempTable AS tt
GROUP BY Id
HAVING COUNT(Id) = @ColumnCount)


DROP TABLE #tempTable

これについて少し説明させてください。

まず、1 つのテーブルのすべての列を反復処理するカーソルを作成します。列ごとに、選択した列の null 以外の値をテーブルで検索する SQL スクリプトを作成しました。基準を満たす行については、その一意の ID を取得して一時テーブルに配置し、このジョブをすべての列に使用しています。

最後に、列数のような数の ID のみが結果セットになります。これは、テーブル内の列数のように出現数が同じ行のみが、すべての列にすべての非 null 値を持つ行である可能性があるためです。

于 2012-12-06T11:42:16.893 に答える
1

これを試して ::

SELECT * FROM mytable WHERE column IS NOT NULL
于 2012-12-06T05:53:57.110 に答える
0

これを試して

SELECT * 
FROM your_table_name
where coalesce(column_1, column_2, column_3, ...., column_n) is not null 
于 2012-12-06T05:58:57.327 に答える
0

SQLだけではそのような概念を表現することはできません。

手続き型言語を使用して、テーブル定義に従ってSQLクエリを動的に構築する必要があります。Oracleでは、辞書ビューUSER_TAB_COLUMNSを使用して列リストを作成できます。

于 2012-12-06T09:28:04.787 に答える
-1

使ってみてIS NOT NULL

SELECT * FROM table WHERE field_name IS NOT NULL

詳細については、null 値の操作に関するmysql のマニュアルを参照してください。

于 2012-12-06T05:53:24.603 に答える