Как получить определенный столбец по его порядковой позиции в таблице с использованием SQL? [Дубликат]

Функции

mysql_ * были обесценены (как и php 5.5), учитывая тот факт, что были разработаны лучшие функции и структуры кода. Тот факт, что функция была обесценена, означает, что больше не будет сделано усилий для ее улучшения с точки зрения производительности и безопасности, что означает, что она менее надежна для будущего.

Если вам нужно больше причин:

  • mysql_ * функции не поддерживают подготовленные операторы.
  • mysql_ * функции не поддерживают привязку параметров.
  • mysql_ * функции не имеют функциональности для объектно-ориентированного программирования.
  • список продолжается ...
7
задан OMG Ponies 29 April 2013 в 01:31
поделиться

8 ответов

Сначала вы должны получить имена столбцов. Большинство платформ поддерживают это:

select column_name,ordinal_position
  from information_schema.columns
 where table_schema = ...
   and table_name = ...
   and ordinal_position <= 2
5
ответ дан Ken Downs 1 September 2018 в 06:58
поделиться

SQL не понимает порядок столбцов. Вам нужно знать имена столбцов, чтобы получить их.

Вы можете посмотреть запрос на информацию_схемы, чтобы получить имена столбцов. Например:

SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'tbl_name'
  ORDER BY ordinal_position
  LIMIT 2;
0
ответ дан Ned Batchelder 1 September 2018 в 06:58
поделиться

A dynamic query с помощью for xml path также выполнит задание:

declare @sql varchar(max)
set @sql = (SELECT top 2 COLUMN_NAME + ',' from information_schema.columns where table_name = 'YOUR_TABLE_NAME_HERE' order by ordinal_position for xml path(''))
set @sql = (SELECT replace(@sql +' ',', ',''))
exec('SELECT ' + @sql + ' from YOUR_TABLE_NAME_HERE')
1
ответ дан NeverHopeless 1 September 2018 в 06:58
поделиться

Вы можете запросить sysobject таблицы, чтобы узнать первые два столбца, а затем динамически сгенерировать требуемый SQL-запрос.

0
ответ дан odez213 1 September 2018 в 06:58
поделиться

Там

declare @select varchar(max)
set @select = 'select '

select @select=@select+COLUMN_NAME+','
from information_schema.columns
where table_name = 'TABLE' and ordinal_position <= 2

set @select=LEFT(@select,LEN(@select)-1)+' from TABLE'
exec(@select)
2
ответ дан pcofre 1 September 2018 в 06:58
поделиться
0
ответ дан RichardTheKiwi 1 September 2018 в 06:58
поделиться

Если вы хотите, чтобы объект permant, который вы можете запрашивать снова и снова, отображал представление для каждой таблицы, которая возвращает только первые 2 столбца. Вы можете назвать столбцы Column1 и Column2 или использовать существующие имена.

Если вы хотите вернуть первые два столбца из любой таблицы без каких-либо шагов предварительной обработки, создайте хранимую процедуру, которая запрашивает системную информацию и выполняет динамическую запрос, который возвращает первые два столбца из таблицы.

0
ответ дан Scott Bruns 1 September 2018 в 06:58
поделиться

Я написал хранимую процедуру некоторое время назад, чтобы выполнить эту точную работу. Несмотря на то, что в теории отношений нет технического порядка столбцов, SSMS не является полностью реляционным. Система хранит порядок, в который были вставлены столбцы, и присваивает им идентификатор. Этот порядок выполняется с использованием типичного оператора SELECT *, поэтому ваши операторы SELECT кажутся возвращать один и тот же порядок каждый раз. На практике никогда не было хорошей идеи SELECT * с чем-либо, поскольку она не блокирует порядок результата в терминах столбцов или строк. Тем не менее, я думаю, что люди так зацикливаются на том, «что вы не должны этого делать», что они не пишут сценарии, которые на самом деле могут это сделать. Факт - это предсказуемое поведение системы, поэтому почему бы не использовать его, если задача не очень важна.

Этот SPROC, конечно, имеет оговорки и написан в T-SQL, но если вы хотите просто вернуть все значения с тем же поведением SELECT *, то это должно сделать работу довольно простой для вас. Введите имя таблицы, количество столбцов и нажмите F5. Он возвращает их в порядке слева направо так же, как вы ожидали. Я ограничил его только 5 столбцами, но вы можете отредактировать логику, если вам нужно больше. Принимает временные и постоянные таблицы.

EXEC OnlySomeColumns «MyTable», 3

/*------------------------------------------------------------------------------------------------------------------

    Document Title: The Unknown SELECT SPROC.sql

    Created By: CR
    Date: 4.28.2013

    Purpose: Returns all results from temp or permanent table when not knowing the column names

    SPROC Input Example: EXEC OnlySomeColumns 'MyTable', 3

--------------------------------------------------------------------------------------------------------------------*/

    IF OBJECT_ID ('OnlySomeColumns', 'P') IS NOT NULL
    DROP PROCEDURE OnlySomeColumns;

    GO

        CREATE PROCEDURE OnlySomeColumns 
                @TableName      VARCHAR (1000),
                @TotalColumns   INT

    AS

        DECLARE @Column1        VARCHAR (1000), 
                @Column2        VARCHAR (1000), 
                @Column3        VARCHAR (1000), 
                @Column4        VARCHAR (1000), 
                @Column5        VARCHAR (1000), 
                @SQL            VARCHAR (1000),
                @TempTable      VARCHAR (1000),
                @PermanentTable VARCHAR (1000),
                @ColumnNamesAll VARCHAR (1000)

        --First determine if this is a temp table or permanent table
        IF @TableName     LIKE '%#%' BEGIN SET @TempTable      = @TableName END --If a temporary table
        IF @TableName NOT LIKE '%#%' BEGIN SET @PermanentTable = @TableName END --If a permanent column name

    SET NOCOUNT ON

        --Start with a few simple error checks
        IF ( @TempTable = 'NULL' AND @PermanentTable = 'NULL' )
            BEGIN
                RAISERROR ( 'ERROR: Please select a TempTable or Permanent Table.',16,1 ) 
            END

        IF ( @TempTable <> 'NULL' AND @PermanentTable <> 'NULL' )
            BEGIN
                RAISERROR ( 'ERROR: Only one table can be selected at a time. Please adjust your table selection.',16,1 ) 
            END

        IF ( @TotalColumns IS NULL )
            BEGIN
                RAISERROR ( 'ERROR: Please select a value for @TotalColumns.',16,1 ) 
            END

    --Temp table to gather the names of the columns
    IF Object_id('tempdb..#TempName') IS NOT NULL DROP TABLE #TempName
    CREATE TABLE #TempName ( ID INT, Name VARCHAR (1000) )

        --Select the column order from a temp table
        IF @TempTable <> 'NULL'
            BEGIN       
                --Verify the temp table exists
                IF NOT EXISTS ( SELECT  1 
                                FROM    tempdb.sys.columns
                                WHERE   object_id = object_id ('tempdb..' + @TempTable +'') )
                BEGIN 
                    RAISERROR ( 'ERROR: Your TempTable does not exist - Please select a valid TempTable.',16,1 ) 
                            RETURN 
                        END 

                SET @SQL = 'INSERT INTO #TempName
                            SELECT  column_id AS ID, Name 
                            FROM    tempdb.sys.columns
                            WHERE   object_id = object_id (''tempdb..' + @TempTable +''')
                            ORDER BY    column_id'
                EXEC (@SQL) 
            END

        --From a permanent table
        IF @PermanentTable <> 'NULL'
            BEGIN       
                --Verify the temp table exists
                IF NOT EXISTS ( SELECT  1
                                FROM    syscolumns
                                WHERE   id =  ( SELECT id 
                                                FROM sysobjects 
                                                WHERE Name = '' + @PermanentTable + '' ) ) 
                BEGIN 
                    RAISERROR ( 'ERROR: Your Table does not exist - Please select a valid Table.',16,1 ) 
                            RETURN 
                        END 

                SET @SQL = 'INSERT INTO #TempName
                            SELECT   colorder AS ID, Name
                            FROM     syscolumns
                            WHERE id = ( SELECT id 
                                         FROM sysobjects 
                                         WHERE Name = ''' + @PermanentTable + ''' )
                            ORDER BY colorder'
                EXEC (@SQL)
            END

        --Set the names of the columns
        IF @TotalColumns >= 1 BEGIN SET @Column1 = (SELECT Name FROM #TempName WHERE ID = 1) END
        IF @TotalColumns >= 2 BEGIN SET @Column2 = (SELECT Name FROM #TempName WHERE ID = 2) END
        IF @TotalColumns >= 3 BEGIN SET @Column3 = (SELECT Name FROM #TempName WHERE ID = 3) END
        IF @TotalColumns >= 4 BEGIN SET @Column4 = (SELECT Name FROM #TempName WHERE ID = 4) END
        IF @TotalColumns >= 5 BEGIN SET @Column5 = (SELECT Name FROM #TempName WHERE ID = 5) END

    --Create a select list of only the column names you want
    IF Object_id('tempdb..#FinalNames') IS NOT NULL DROP TABLE #FinalNames
    CREATE TABLE #FinalNames ( ID INT, Name VARCHAR (1000) )

            INSERT  #FinalNames
            SELECT  '1' AS ID, @Column1 AS Name UNION ALL
            SELECT  '2' AS ID, @Column2 AS Name UNION ALL
            SELECT  '3' AS ID, @Column3 AS Name UNION ALL
            SELECT  '4' AS ID, @Column4 AS Name UNION ALL
            SELECT  '5' AS ID, @Column5 AS Name

            --Comma Delimite the names to insert into a select statement. Bracket the names in case there are spaces 
            SELECT  @ColumnNamesAll = COALESCE(@ColumnNamesAll + '], [' ,'[') + Name
            FROM    #FinalNames
            WHERE   Name IS NOT NULL
            ORDER BY ID

            --Add an extra bracket at the end to complete the string
            SELECT  @ColumnNamesAll = @ColumnNamesAll + ']'

        --Tell the user if they selected to many columns
        IF ( @TotalColumns > 5 AND EXISTS (SELECT 1 FROM #FinalNames WHERE Name IS NOT NULL) )
            BEGIN
                SELECT 'This script has been designed for up to 5 columns' AS ERROR
                UNION ALL
                SELECT 'Only the first 5 columns have been selected' AS ERROR
            END

        IF Object_id('tempdb..#FinalNames') IS NOT NULL DROP TABLE ##OutputTable

        --Select results using only the Columns you wanted
        IF @TempTable <> 'NULL'
            BEGIN
                SET @SQL = 'SELECT  ' + @ColumnNamesAll + '
                            INTO    ##OutputTable
                            FROM     ' + @TempTable + ' 
                            ORDER BY 1'
                EXEC (@SQL)
            END

        IF @PermanentTable <> 'NULL'
            BEGIN
                SET @SQL = 'SELECT  ' + @ColumnNamesAll + '
                            INTO    ##OutputTable
                            FROM     ' + @PermanentTable + ' 
                            ORDER BY 1'
                EXEC (@SQL) 
            END

    SELECT  *
    FROM    ##OutputTable

    SET NOCOUNT OFF
1
ответ дан user2306008 1 September 2018 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: