簡體   English   中英

是否可以僅選擇存在至少一個值的列?

[英]Is it possible to select only columns where at least one value is present?

我需要選擇所有存在至少一個值的同語。 例如,如果這是我的表:

----------------------------
name   |  keyword  |  zip
----------------------------
User1  |  test     |  ""
User2  |  test     |  ""
User3  |  ""       |  ""

應該輸出如下內容:

-----------------
name   |  keyword  
-----------------
User1  |  test     
User2  |  test     
User3  |  ""       

問題是zip可能不會為空,在這種情況下,輸出還應該包括zip列。 我需要此功能的實際表具有許多可能為空的列。

我嘗試使用SELECT * FROM myTable HAVING COUNT(*) > 0但是不起作用(仍然顯示空列)。

還嘗試使用php使用循環來解決它,但是也沒有達到那種程度。

是否有可能使用SQL這樣的事情,還是應該例如使用php完成?

這是我使用此問題的建議在PHP中想到的解決方案。

$stack = array("keyword", "zip");
$id = $_POST["id"];
$sql = "SELECT name";
foreach($stack as $i){
    $q = "SELECT ".$i." FROM myTable WHERE ".$i." != '' AND id = '".$id."'";
    $result = mysqli_query($link, $q);
    if(mysqli_num_rows($result) > 0){
        $sql = $sql.", ".$i;
    }
}
$sql = $sql." FROM myTable WHERE id = '".$id."'";

這將輸出以下sql查詢: SELECT name, keyword FROM myTable WHERE id = 'postedId'

請注意,select中缺少zip ,這是因為對於該特定查詢,zip中沒有任何值。 $stack數組中,您可以放入要檢查的任何列。

還要記下我是如何使用!= ''檢查空值的,但是如果您的表具有空值作為NULL確保使用IS NOT NULL代替。

這是很痛苦的,並且不是真正的SQL精神-在select語句編寫語句時, select語句具有固定數量的列。

也就是說,您可以使用兩種級別的動態SQL,一種用於獲取列,一種用於使用它們:

-- generate the SQL to identify the columns

select @sql := group_concat(replace('select max(''[column_name]'') as col from t having count([column_name]) > 0', '[column_name]', c.column_name)
                    separator ' union all ' )
from information_schema.columns c
where table_name = 't';

-- use the SQL to get the columns
select @sql := concat('select group_concat(col separator '', '') into @cols from (', @sql, ') x');

-- run the SQL
prepare s from @sql;
execute s  ;

-- create the final query using the columns
set @sql2 = concat('select ', @cols, ' from t');

-- and execute it
prepare s2 from @sql2;
execute s2;

注意:在實際的應用程序中,您需要取消分配准備好的語句。

是說明此過程的db <>小提琴。

這不是一個真正的答案。
這只是如何在Oracle中完成的一個示例(我對MySQL的經驗很少):

DECLARE
  has_keyword INTEGER;
  has_zip     INTEGER;
  sql         VARCHAR2(1024);
BEGIN

  -- Determine the columns having at least 1 row with a not null value
  SELECT CASE WHEN MAX(keyword) IS NULL THEN 0 ELSE 1 END,
         CASE WHEN MAX(zip)     IS NULL THEN 0 ELSE 1 END
    INTO has_keyword,
         has_zip
    FROM my_table;

  -- Compose query
  sql := 'SELECT name';
  IF (has_keyword > 0) THEN
    sql := sql || ', keyword';
  END IF;
  IF (zip > 0) THEN
    sql := sql || ', zip';
  END IF;
  sql := sql || ' FROM my_table';

  -- Execute query
  EXECUTE IMMEDIATE sql;

END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM