簡體   English   中英

如何根據表中的順序選擇列

[英]how to select column based on its on order in Table

我想根據其順序從表中選擇列

create Table Products
(
  ProductId Int,
  ProductName varchar(50)
)

可以說我不知道​​第二列的名稱。

我如何得到它像:

Select Col1,Col2 From Product

對於SQL Server:

您不能在SELECT子句中執行此操作。 您無法基於列的訂單號進行選擇。 您必須列出需要顯式選擇的列名,否則,請使用SELECT *列出所有列。 如果您正在使用數據讀取器對象或任何其他ado.net方法從數據庫中獲取數據,則可以執行以下操作,但這將基於SQL語句中列出的列名列表。

但是,您可以通過從information_schema.columns讀取列的元數據ordinal_position來動態地執行這樣的操作,如以下答案所示:

但是,您可以在ORDER BY子句中執行此操作。 您可以按列號ORDER BY

SELECT *
FROM TableName
ORDER BY 2; -- for col2

但這不建議在ORDER BYSELECT (如果有)中使用。 此外,列順序在關系模型中並不重要。

更新:如果要從傳遞給存儲過程的任何表參數中至少選擇3列。 嘗試如下操作:

您的存儲過程應該接收參數@tableNameParam 以下代碼應返回@tablenameParam傳遞到存儲過程的前三列:

DECLARE @col1 AS VARCHAR(100);
DECLARE @col2 AS VARCHAR(100);
DECLARE @col3 AS VARCHAR(100);
DECLARE @tableNameParam AS VARCHAR(50) = 'Tablename';

DECLARE @sql AS VARCHAR(MAX) ;

SELECT @col1 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam
                             AND ordinal_position = 1;

SELECT @col2 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam;
                             AND ordinal_position = 2;

SELECT @col3 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam;
                             AND ordinal_position = 3;

SET @sql = 'SELECT ' + col1 + ',' + col2 ' + 'col3 ' + FROM ' + @tablename; 

你總是可以做

select * from Product

我想分享以下代碼,作為對表內Ordinal Position進行CRUD處理的解決方案。 我今天遇到了這個問題,花了我很長時間研究和找到可行的解決方案。 許多已發布的答案表明無法與Ordinal基礎上的表列進行交互,但是如上一博文所述,使用information_schema表可以允許使用列位置。

我的情況是與使用樞軸視圖填充的表進行交互,因此列始終根據數據而變化,這在視圖結果中很好,但是當數據集存儲到表中時,列是動態的。 列名稱是“年-月”組合,例如201801、201802,其中項目編號為主​​鍵。 該數據透視表將在12個月的滾動月份中按年/月指示制造數量,因此每個月的列名稱都會發生更改/班次,這會在每月重建表時更改其順序位置。

“數據透視”視圖用於構建暫存表,“暫存”表用於構建目標表,因此,暫存表和目標表的順序位置以相同的順序位置對齊。

            Declare @colname    Varchar(55) -- Column Name
            Declare @ordpos     INT         -- Ordinal Position
            Declare @Item       Varchar(99) -- PK
            Declare @i          INT         -- Counter
            Declare @cnt        INT         -- Count
            Declare @ids        table(idx int identity(1,1), Item Varchar(25))
        -- Item List
                Insert INTO @ids Select Item From DBName.Schema.TableName   
                    select @i = min(idx) - 1, @cnt = max(idx) from @ids
        -- Row Loop
                While @i < @cnt
                Begin
                    Select @i = @i + 1
                    Set @ordpos=3
                    Set @Item = (select Item from @ids where idx = @i)
        --   Column Loop
                    While @ordpos < 27
                        Begin
                            Select @colname =column_name From INFORMATION_SCHEMA.Columns Where table_name='TargetTable' and ordinal_position=@ordpos
                            Exec ('Update TargetTable set ['+@colname+']= (Select ['+@colname+'] From StagingTable Where Item='''+@Item+''')         where Item='''+@Item+'''')
                            Set @ordpos=@ordpos + 1
                        End -- End Column Loop
                End -- End Row Loop

此處的代碼將按行和按列循環遍歷Item矩陣,並使用Dynamic SQL來構建操作,在這種情況下,該操作是更新,但也可以很容易地將其作為選擇。 每列都通過While循環進行處理,然后遍歷下一行。 這允許通過(Item X YearMonth)更新矩陣中的特定單元格,而無需實際知道給定位置的列名。

一個問題是,取決於此矩陣中數據的大小,它可能很慢。 我只是想將其顯示為在順序位置使用未知列名稱的方法。

暫無
暫無

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

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