[英]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.