Sybase
在 sybase(Transact SQL)中查詢 COLUMN_NAME LIKE “X”?
我需要在 Sybase 中自動編寫查詢。
該表如下所示:
ID, A1, A2, A3, ..., A24, B1, B2, B3, ..., B24, etc.
我想要一個查詢,使用者可以在其中選擇返回哪些列。例如,有時使用者可以選擇所有
A*
列,有時他們可以選擇所有B*
列,有時他們可以選擇任何列。我需要編寫一個查詢來讀取所有列的值,例如:
SELECT a*,b* FROM Users
要麼
SELECT * FROM Users WHERE column_name LIKE a%, b%
第一:這並不容易實現,而且很容易崩潰(我的意思是性能會很糟糕,如果你不是很小心的話,這是一個很好的 SQL 注入攻擊的小途徑)。我強烈建議你重新考慮你在做什麼,因為必須有更好的方法。
第二:目前的問題實際上沒有意義 - 您在列上檢查什麼條件?
NOT NULL
? 還有,你想AND
還是OR
條件一起?但是,要真正回答這個問題,您需要編寫一些動態 SQL:
- 連結
sysobjects
到syscolumns
,按表名和您感興趣的欄位進行過濾。- 使用游標建構可執行 SQL 語句,然後執行它。
下面的範例是,對於
Users
表中以“A”或“B”開頭的每一列,返回Users
表中在任何這些列中具有非空值的所有行。**注意:**我沒有方便的 Sybase 安裝來測試它。它實際工作的機會非常低,但希望它足以讓你意識到這是一個多麼糟糕的主意。
DECLARE @colname nvarchar(255), @sql nvarchar(4000) SET @sql = 'SELECT * FROM Users WHERE ' DECLARE colcur CURSOR FOR SELECT sc.name FROM syscolumns sc INNER JOIN sysobjects so ON so.id = sc.id WHERE so.name = 'Users' AND so.type = 'U' AND (sc.name LIKE 'A%' OR sc.name LIKE 'B%') ORDER BY sc.name OPEN colcur WHILE 1=1 BEGIN FETCH colcur INTO @colname SET @sql = @sql + @colname + ' IS NOT NULL OR ' END DEALLOCATE colcur SET @sql = LEFT(@sql, LEN(@sql) - 3) -- need to trim off the trailing 'OR' EXEC @sql