Sybase

在 sybase(Transact SQL)中查詢 COLUMN_NAME LIKE “X”?

  • September 10, 2012

我需要在 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:

  • 連結sysobjectssyscolumns,按表名和您感興趣的欄位進行過濾。
  • 使用游標建構可執行 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

引用自:https://dba.stackexchange.com/questions/12166