SQL ไม่รวมคอลัมน์โดยใช้ SELECT * [ยกเว้นคอลัมน์ A] จาก tableA หรือไม่


733

เราทุกคนรู้ว่าการเลือกคอลัมน์ทั้งหมดจากตารางเราสามารถใช้

SELECT * FROM tableA

มีวิธียกเว้นคอลัมน์จากตารางโดยไม่ระบุคอลัมน์ทั้งหมดหรือไม่

SELECT * [except columnA] FROM tableA

วิธีเดียวที่ฉันรู้คือการระบุคอลัมน์ทั้งหมดด้วยตนเองและแยกคอลัมน์ที่ไม่ต้องการ นี่ใช้เวลามากดังนั้นฉันกำลังมองหาวิธีที่จะประหยัดเวลาและความพยายามในเรื่องนี้รวมถึงการบำรุงรักษาในอนาคตหากตารางมีคอลัมน์มากขึ้น / น้อยลง


27
มันจะสะดวกมากที่จะมีคุณสมบัตินี้ไม่ต้องใส่รหัสการผลิต แต่เพื่อการแก้ไขปัญหา ตัวอย่าง: ฉันมีตารางที่มีหลายคอลัมน์ที่ฉันสืบค้น แต่ฉันต้องการละเว้นคอลัมน์ข้อความหนึ่งหรือสองอย่างรวดเร็ว
คาห์บี

ฉันต้องการสิ่งนี้เมื่อทำงานกับ openquery (แม้ว่าฉันต้องการฟังก์ชันการทำงานใน MySQL แทนที่จะเป็น SQL Server) ฉันต้องสืบค้นฐานข้อมูล MySQL โดยใช้ SQL Server เนื่องจากตาราง MySQL มีคอลัมน์ความกว้างคงที่ฉันจึงไม่สามารถใช้SELECT *แบบสอบถามได้ (OLE DB มีปัญหาในการจับคู่ข้อมูลเหล่านั้น) ฉันไม่สามารถระบุคอลัมน์แล้วเพราะผมไม่เคยเข้าถึงโดยตรงไปยังฐานข้อมูล MySQL แต่ SQL Server เป็นชนิดพอที่จะแจ้งให้ฉันชื่อของการแก้ไขความกว้างคอลัมน์ถ่านที่ ...
jahu

2
ฉันต้องการเพิ่มอีกเหตุผลหนึ่งในการทำเช่นนี้: SELECT DISTINCT *ยกเว้นคอลัมน์คีย์ที่จะทำงานโดยไม่มีแถวที่ซ้ำกันซึ่งสร้างขึ้นโดยคนอื่น
ยกเลิกการจัดเรียง

1
ฉันยอมรับว่ามันใช้เวลานาน นี่คือเหตุผลที่ฉันมักจะคลิกขวาบนโต๊ะเลือก "เลือกบน 1,000 แถว" จากนั้นลบคอลัมน์ที่ฉันไม่ต้องการ
ThomasRones

2
ที่จะไม่ลืม: ในหลายกรณีนักพัฒนาไม่รู้จักคอลัมน์เพราะพวกเขาสามารถเปลี่ยน นี่เป็นเรื่องปกติในคลังข้อมูล หลังจาก 6 เดือนพวกเขาจะเพิ่มคอลัมน์เพิ่มเติมและควรเลือกโดยไม่ต้องเปลี่ยนรหัส

คำตอบ:


446

ฉันเห็นด้วยกับทุกคน ... แต่ถ้าฉันจะทำอะไรแบบนี้ฉันอาจทำแบบนี้:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

222
ไม่มีประสิทธิภาพ ... แต่มีความคิดสร้างสรรค์มาก :)
Guillermo Gutiérrez

1
สวย. ฉันมักจะต้องรวมเข้าร่วมสองตารางชั่วคราวหรือชั่วคราวไปยังตารางอื่นที่ฉันไม่ต้องการคอลัมน์ทั้งหมดในอุณหภูมิ - โดยเฉพาะอย่างยิ่งเพราะการจัดกลุ่มจะมีส่วนร่วม
VISQL

2
ดีมาก. แน่นอนว่าจะช่วยแก้ปัญหาการสรุปชื่อคอลัมน์
เครื่องปิ้งขนมปัง

1
@CeesTimmerman - หากคุณมีคำถามที่เกี่ยวข้องกับชื่อคอลัมน์ที่ซ้ำกันนั่นคือปัญหาที่แยกต่างหากนั่นคือไม่คำนึงถึงวิธีการที่คุณใช้ Google "เปลี่ยนชื่อคอลัมน์ SQL" หรือ "นามแฝงคอลัมน์ SQL" ของ Google สิ่งที่ชอบSELECT table1.ID AS table1ID ..., IIRC
ToolmakerSteve

3
@ToolmakerSteve แนวคิดของคำถามนี้คือการระบุเฉพาะคอลัมน์ที่คุณไม่ต้องการ คอลัมน์การตั้งชื่อจะต้องระบุทั้งหมด, พูด, 20+ คอลัมน์ของตารางเฉพาะ
Cees Timmerman

289

เลขที่

แนวทางปฏิบัติที่ดีที่สุดในการบำรุงรักษาคือระบุคอลัมน์ที่จำเป็นเท่านั้น

อย่างน้อย 2 เหตุผล:

  • สิ่งนี้ทำให้สัญญาของคุณระหว่างไคลเอนต์และฐานข้อมูลมีเสถียรภาพ ข้อมูลเดิมทุกครั้ง
  • ประสิทธิภาพครอบคลุมดัชนี

แก้ไข (กรกฎาคม 2011):

หากคุณลากจาก Object Explorer ไปยังColumnsโหนดสำหรับตารางมันจะใส่รายการคอลัมน์ของ CSV ลงในหน้าต่าง Query เพื่อให้คุณบรรลุเป้าหมายอย่างใดอย่างหนึ่ง


3
ฉันไม่เคยรู้เรื่องการลาก columsn ขอบคุณ GBN คุณได้บันทึกวันนั้นอีกครั้ง คุณต้องทำเงินเป็นจำนวนมาก $$ เนื่องจากความเชี่ยวชาญใน SQL ของคุณ
l

4
มีสถานการณ์ที่ถูกต้องกับ SELECT * โดยเฉพาะใน ETL รูทีน ฉันคิดว่าคำตอบที่ดีที่สุดคือคำตอบที่มีไดนามิก SQL
mishkin

1
มีหลายกรณีที่คุณต้องการเลือกพูดข้อมูลทั้งหมดสำหรับนักเรียนเพื่อการสำรวจเชิงสถิติ แต่ไม่นำรหัสนักศึกษามาเพื่อเสริมความเป็นส่วนตัว
George Birbilis

3
"ระบุเฉพาะคอลัมน์ที่จำเป็นต้องใช้" - การเข้ารหัสแบบไร้สาระยาก
RM Haley

9
แม้ว่าคำตอบเช่นนี้จะได้รับคะแนนโหวตจำนวนมาก แต่ก็ไม่มีค่าเท่าที่ฉันกังวล โดยทั่วไปแล้วความสามารถในการ "เลือก * ยกเว้น ABC" นั้นไม่มีปัญหาอีกต่อไปที่ "Select *" ซึ่งภาษารองรับ OP กำลังขออย่างชัดเจนถึงวิธีที่จะทำอะไรบางอย่างให้สำเร็จ ผู้ตอบคำถามนี้ไม่มีทางรู้ว่า OP ต้องการใช้สิ่งนี้ในรหัสการผลิตหรือถ้าพวกเขาต้องการเรียกใช้แบบสอบถามแบบนี้ทันทีในขณะที่พวกเขากำลังพัฒนารหัสสำหรับฐานข้อมูลดังนั้นการบรรยายเกี่ยวกับมาตรฐานที่ดี ไม่ก่อให้เกิดคุณค่าใด ๆ ทั้งสิ้น
Itsme2003

68

หากคุณไม่ต้องการเขียนชื่อคอลัมน์แต่ละชื่อด้วยตนเองคุณสามารถใช้Script Table Asโดยคลิกขวาที่ตารางหรือดูในSSMSดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคุณจะได้รับแบบสอบถามแบบเลือกทั้งหมดในหน้าต่างตัวแก้ไขคิวรีใหม่จากนั้นลบคอลัมน์ที่ไม่ต้องการดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

เสร็จสิ้น


2
นี่ง่ายกว่าการเลือกชื่อคอลัมน์ทั้งหมดแล้วเพิ่มเครื่องหมายจุลภาค
shaijut

68

วิธีอัตโนมัติใน SQL (SQL Server) คือ:

declare @cols varchar(max), @query varchar(max);
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']';

SELECT @query = 'select ' + @cols + ' from MyTable';  
EXEC (@query);

ถ้าคุณกำลังสอบถามจากผลลัพธ์ของ CTE หรือแบบสอบถามย่อยอื่น ๆ ตัวอย่างง่ายๆ: คุณอาจต้องการสร้างแบบสอบถามย่อยที่ต่อท้ายผลลัพธ์ของrow_number()แต่ละแถวจากนั้นทำการเข้าร่วมโดยrow_numberแล้วเลือกทุกอย่างที่ไม่รวมrow_numberจากผลลัพธ์ของการเข้าร่วม
ely

43

คุณสามารถสร้างมุมมองที่มีคอลัมน์ที่คุณต้องการเลือกจากนั้นคุณสามารถทำได้select *จากมุมมอง ...


8
ในตอนแรกปฏิกิริยาของฉันคือ "มันง่ายกว่าการระบุคอลัมน์" ได้อย่างไร แต่จากนั้นฉันตัดสินใจว่าจากมุมมองการบำรุงรักษามันอาจเป็นการปรับปรุง
ToolmakerSteve

1
สิ่งนี้ยังสนับสนุนเครื่องมือเพิ่มประสิทธิภาพคิวรีมากกว่าที่จะตอบโต้ด้วยตารางชั่วคราวหรือ SQL แบบไดนามิก
underscore_d

30

ใช่เป็นไปได้ (แต่ไม่แนะนำ)

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

คำอธิบายของรหัส :

  1. ประกาศตัวแปรเพื่อเก็บรายการชื่อคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค ค่าเริ่มต้นนี้เป็น NULL
  2. ใช้มุมมองระบบเพื่อกำหนดชื่อของคอลัมน์ในตารางของเรา
  3. ใช้SELECT @variable = @variable + ... FROMเพื่อต่อชื่อคอลัมน์ ประเภทนี้SELECTจะไม่ส่งคืนชุดผลลัพธ์ นี่อาจเป็นพฤติกรรมที่ไม่มีเอกสาร แต่ทำงานได้กับ SQL Server ทุกเวอร์ชัน เป็นอีกทางเลือกหนึ่งที่คุณสามารถใช้SET @variable = (SELECT ... FOR XML PATH(''))เชื่อมสตริงได้
  4. ใช้ISNULLฟังก์ชั่นเพื่อเติมเครื่องหมายคอมม่าเฉพาะในกรณีที่ไม่ใช่ชื่อคอลัมน์แรก ใช้QUOTENAMEฟังก์ชั่นเพื่อรองรับช่องว่างและเครื่องหมายวรรคตอนในชื่อคอลัมน์
  5. ใช้ส่วนWHEREคำสั่งเพื่อซ่อนคอลัมน์ที่เราไม่ต้องการเห็น
  6. ใช้EXEC (@variable)หรือที่เรียกว่าไดนามิก SQLเพื่อแก้ไขชื่อคอลัมน์ตอนรันไทม์ สิ่งนี้จำเป็นเนื่องจากเราไม่ทราบชื่อคอลัมน์ในเวลารวบรวม

ขอบคุณ! นี่คือกุญแจสำคัญในการแก้ปัญหาของฉัน
อันโตนิโอ

ฉันมีคำถามหนึ่งข้อ: เหตุใดจึงต้องเลือกตัวเลือกที่สองในคำสั่ง EXEC ฉันได้เห็นว่ามันจำเป็นอย่างมีประสิทธิภาพ แต่ฉันสงสัยว่าทำไมฉันไม่สามารถเขียนได้ง่าย ๆSELECT @columns FROM contact
Antonio

17

เช่นเดียวกับที่คนอื่น ๆ บอกว่าไม่มีวิธีการทำเช่นนี้ แต่ถ้าคุณใช้ SQL Server เคล็ดลับที่ฉันใช้คือการเปลี่ยนผลลัพธ์เป็นจุลภาคแยกแล้วทำ

select top 1 * from table

และตัดรายการคอลัมน์ทั้งหมดจากหน้าต่างผลลัพธ์ จากนั้นคุณสามารถเลือกคอลัมน์ที่คุณต้องการโดยไม่ต้องพิมพ์คอลัมน์ทั้งหมด


13
ดูเคล็ดลับของฉันเกี่ยวกับการลากจาก SSMS
GBN

11

โดยทั่วไปคุณไม่สามารถทำสิ่งที่คุณต้องการได้ แต่คุณสามารถใช้เครื่องมือที่เหมาะสมเพื่อช่วยให้คุณทำสิ่งต่าง ๆ ได้ง่ายขึ้น

หากคุณดูพรอมต์ SQLของ Red-Gate คุณสามารถพิมพ์ "SELECT * FROM MyTable" แล้วเลื่อนเคอร์เซอร์กลับหลัง "*" และกด <TAB> เพื่อขยายรายการของเขตข้อมูล ไม่ต้องการ

มันไม่ใช่ทางออกที่สมบูรณ์แบบ แต่เป็นคำตอบที่ดี! :-) Intellisense ของ MS SQL Server Management Studio ยังไม่ดีเท่าที่ควรสำหรับคุณสมบัตินี้ .......

มาร์ค


สิ่งนี้ดี แต่ปัญหาคือข้อความค้นหาของคุณอาจมีขนาดใหญ่มาก มันจะดีถ้ามีคุณสมบัติ "ยกเว้น" ไม่ใช่รหัส prod แต่เป็นการสอบถามแบบเฉพาะกิจ
คาห์บี

8

ไม่มีวิธีการทำเช่นนี้ บางทีคุณสามารถสร้างมุมมองที่กำหนดเองถ้าเป็นไปได้ในสถานการณ์ของคุณ

แก้ไขอาจเป็นได้ถ้าฐานข้อมูลของคุณรองรับการเรียกใช้งาน sql แบบไดนามิกคุณสามารถเขียน SP และส่งผ่านคอลัมน์ที่คุณไม่ต้องการดูและให้มันสร้างคิวรีแบบไดนามิกและส่งคืนผลลัพธ์ให้กับคุณ ฉันคิดว่านี่เป็นสิ่งที่ทำได้ใน SQL Server อย่างน้อย


13
มันเป็นไปได้ แต่ฉันจะยิงคนที่ทำอย่างนั้น
Lieven Keersmaekers

ปัญหาการล้างข้อมูลแบบคลาสสิก: คัดลอก dfata ที่คุณต้องการเก็บไว้ในตารางชั่วคราวตัดส่วนที่ใหญ่ออกแล้วเติมข้อมูลลงในตารางชั่วคราวอีกครั้ง คุณต้องยกเว้นคอลัมน์ข้อมูลประจำตัว
Volker

8

หากคุณใช้ SQL Server Management Studio ให้ทำดังนี้:

  1. พิมพ์ชื่อตารางที่คุณต้องการและเลือก
  2. กดAlt+F1
  3. o / p แสดงคอลัมน์ในตาราง
  4. เลือกคอลัมน์ที่ต้องการ
  5. คัดลอกและวางในคิวรีที่คุณเลือก
  6. ไฟแบบสอบถาม

สนุก.


7

ใน SQL Management Studio คุณสามารถขยายคอลัมน์ใน Object Explorer จากนั้นลากColumnsรายการต้นไม้ลงในหน้าต่างแบบสอบถามเพื่อรับรายการคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค


6

โดยสรุปคุณไม่สามารถทำได้ แต่ฉันไม่เห็นด้วยกับความคิดเห็นทั้งหมดข้างต้นมี "เป็น" สถานการณ์ที่คุณสามารถใช้ * อย่างถูกกฎหมายเมื่อคุณสร้างแบบสอบถามซ้อนเพื่อเลือกช่วงเฉพาะจากรายการทั้งหมด (เช่น การเพจ) ทำไมในโลกนี้จึงต้องการระบุแต่ละคอลัมน์ในคำสั่ง select ด้านนอกเมื่อคุณทำมันในด้านใน?


คุณสามารถใช้รูปแบบ "innername. *" เพื่อเป็นตัวแทนคอลัมน์ภายในซึ่งคล้ายกับ "SELECT table1. * ... " เมื่อทำการเข้าร่วมหรือไม่
ToolmakerSteve

6
DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'

SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID(@TableName)
AND name NOT IN ('Not This', 'Or that');

SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName

EXEC (@SQL)

UPDATE:

คุณสามารถสร้างโพรซีเดอร์ที่เก็บไว้เพื่อดูแลภารกิจนี้หากคุณใช้บ่อยขึ้น ในตัวอย่างนี้ฉันใช้STRING_SPLIT ()ซึ่งมีอยู่แล้วใน SQL Server 2016+ แต่ถ้าคุณต้องการมีตัวอย่างของวิธีสร้างด้วยตนเองบน SO

CREATE PROCEDURE [usp_select_without]
@schema_name sysname = N'dbo',
@table_name sysname,
@list_of_columns_excluded nvarchar(max),
@separator nchar(1) = N','
AS
BEGIN
 DECLARE 
 @SQL nvarchar(max),
 @full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);

 SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
 FROM sys.columns sc
 LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
 WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name, N'u')
 AND ss.[value] IS NULL;

 SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
 EXEC(@SQL)
END

แล้วก็:

EXEC [usp_select_without] 
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';

5

หากเรากำลังพูดถึงโพรซีเดอร์มันจะทำงานร่วมกับเคล็ดลับนี้เพื่อสร้างคิวรีใหม่และดำเนินการทันที :

SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');

5

มีวิธียกเว้นคอลัมน์จากตารางโดยไม่ระบุคอลัมน์ทั้งหมดหรือไม่

ใช้การประกาศ SQL ในวิธีปกติไม่มี

ฉันคิดว่าไวยากรณ์ที่คุณเสนอมีค่าและดี อันที่จริงภาษาฐานข้อมูลเชิงสัมพันธ์ 'Tutorial D' มีไวยากรณ์ที่คล้ายกันมากซึ่งคำหลักALL BUTจะตามด้วยชุดของคุณลักษณะ (คอลัมน์)

อย่างไรก็ตาม SQL SELECT *ได้รับสะเก็ดระเบิด (คำตอบ @ Guffa ของที่นี่เป็นข้อคัดค้านทั่วไป) ดังนั้นฉันไม่คิดว่าSELECT ALL BUTจะเข้าสู่มาตรฐาน SQL ได้ในไม่ช้า

ฉันคิดว่า 'การทำงาน' ที่ดีที่สุดคือการสร้างVIEWคอลัมน์ที่คุณต้องการSELECT * FROM ThatViewเท่านั้น


1
@underscore_d: ตอนนี้ฉันได้แก้ไขคำตอบแล้ว
oneday เมื่อ

เยี่ยมฉันเห็นด้วยกับ 2 ย่อหน้าสุดท้ายของคุณ ข้อมูลเกี่ยวกับ Tutorial D นั้นน่าสนใจแม้ว่าฉันมักจะเห็นด้วยกับคนที่คิดว่าselect *น่าสงสัย แต่ก็มีประโยชน์มากสำหรับสิ่งเฉพาะกิจและโปรแกรมที่ต้องการจัดการตารางข้อมูลโดยทั่วไป แต่ไม่มากนักสำหรับการสร้าง (ขาดคำที่ดีกว่า) ข้อความค้นหา 'บริสุทธิ์' ถึงกระนั้นการไม่ได้อยู่ในมาตรฐาน ANSI ไม่ได้หมายความว่า Microsoft ไม่สามารถเพิ่มลงในภาษาของพวกเขาเช่นเดียวกับสิ่งอื่น ๆ อีกมากมาย แต่ฉันสงสัยว่าพวกเขาจะ
underscore_d

5

ภาษา SQL สมัยใหม่อย่าง BigQuery เสนอทางออกที่ยอดเยี่ยม

SELECT * ยกเว้น (ColumnNameX, [ColumnNameY, ... ])

นี่เป็นไวยากรณ์ SQL ที่มีประสิทธิภาพมากเพื่อหลีกเลี่ยงรายการคอลัมน์ที่ต้องอัปเดตตลอดเวลาเนื่องจากการเปลี่ยนชื่อคอลัมน์ตาราง และฟังก์ชั่นนี้จะหายไปในการใช้งาน SQL Server ปัจจุบันซึ่งน่าเสียดาย หวังว่าวันหนึ่ง Microsoft Azure จะเป็นนักวิทยาศาสตร์ด้านข้อมูลได้ง่ายขึ้น

นักวิทยาศาสตร์ด้านข้อมูลต้องการที่จะมีตัวเลือกที่รวดเร็วในการย่อแบบสอบถามและสามารถลบคอลัมน์บางส่วนได้ (เนื่องจากการทำซ้ำหรือเหตุผลอื่น ๆ )

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers


4

Postgres sql มีวิธีการทำ

กรุณาอ้างอิง: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

โครงสร้างข้อมูลแฮ็กข้อมูล

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

ด้านบนสำหรับตารางตัวอย่างเฉพาะของฉัน - สร้างคำสั่ง sql ที่มีลักษณะเช่นนี้

เลือก o.officepark, o.owner, o.squarefootage จาก officepark เป็น o


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Bhargav Rao

3

ฉันไม่รู้ฐานข้อมูลใด ๆ ที่รองรับสิ่งนี้ (SQL Server, MySQL, Oracle, PostgreSQL) มันไม่ได้เป็นส่วนหนึ่งของมาตรฐาน SQL ดังนั้นฉันคิดว่าคุณต้องระบุเฉพาะคอลัมน์ที่คุณต้องการ

แน่นอนคุณสามารถสร้างคำสั่ง SQL ของคุณแบบไดนามิกและให้เซิร์ฟเวอร์ดำเนินการได้ แต่นี่จะเปิดโอกาสให้ SQL injection ได้


3

ฉันรู้ว่านี่เก่าไปหน่อย แต่ฉันเพิ่งเจอปัญหาเดียวกันและกำลังหาคำตอบ จากนั้นฉันก็มีนักพัฒนาอาวุโสแสดงให้ฉันเห็นเคล็ดลับง่าย ๆ

หากคุณกำลังใช้เอดิเตอร์เคียวรี studio studio ให้ขยายฐานข้อมูลจากนั้นขยายตารางที่คุณกำลังเลือกเพื่อให้คุณเห็นโฟลเดอร์คอลัมน์

ในคำสั่งเลือกของคุณเพียงแค่ไฮไลต์โฟลเดอร์คอลัมน์ที่อ้างถึงด้านบนแล้วลากและวางลงในหน้าต่างแบบสอบถาม มันจะวางคอลัมน์ทั้งหมดของตารางจากนั้นเพียงแค่ลบคอลัมน์ข้อมูลประจำตัวออกจากรายการของคอลัมน์ ...


1
ใช่ แต่ถ้าคุณมี 5 ตัวความคิดจะทำอย่างไรSELECT * Except(tableName.ColumnName) FROM ...
Pawel Cioch

ฉันพบว่ามีประโยชน์ :) ฉันไม่ทราบเกี่ยวกับสิ่งนั้น แต่นี่ไม่ใช่คำตอบสำหรับคำถามหัวข้อ
Fka

3

วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการใช้มุมมองคุณสามารถสร้างมุมมองด้วยคอลัมน์ที่ต้องการและดึงข้อมูลจากแบบฟอร์ม

example

mysql> SELECT * FROM calls;
+----+------------+---------+
| id | date       | user_id |
+----+------------+---------+
|  1 | 2016-06-22 |       1 |
|  2 | 2016-06-22 |    NULL |
|  3 | 2016-06-22 |    NULL |
|  4 | 2016-06-23 |       2 |
|  5 | 2016-06-23 |       1 |
|  6 | 2016-06-23 |       1 |
|  7 | 2016-06-23 |    NULL |
+----+------------+---------+
7 rows in set (0.06 sec)

mysql> CREATE VIEW C_VIEW AS
    ->     SELECT id,date from calls;
Query OK, 0 rows affected (0.20 sec)

mysql> select * from C_VIEW;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2016-06-22 |
|  2 | 2016-06-22 |
|  3 | 2016-06-22 |
|  4 | 2016-06-23 |
|  5 | 2016-06-23 |
|  6 | 2016-06-23 |
|  7 | 2016-06-23 |
+----+------------+
7 rows in set (0.00 sec)

3
จะเกิดอะไรขึ้นถ้าจำนวนคอลัมน์มีขนาดใหญ่ให้บอกว่า 100 & เราต้องการเลือกคอลัมน์ทั้งหมด แต่จะมีคอลัมน์เดียว มีแนวทางที่ดีกว่านี้ไหม?
KartikKannapur

5
จุดนี้พลาดจุดหนึ่ง คุณกำลังเลือก "id, date" ในสายที่สองซึ่งหากคุณกำลังจะทำเช่นนั้นเพียงแค่ทำมันในสถานที่แรก
keithpjolley

3

หากคุณต้องการแยกคอลัมน์กรณีที่ละเอียดอ่อนเช่นรหัสผ่านให้ทำเช่นนี้เพื่อซ่อนค่า:

SELECT * , "" as password FROM tableName;


อันนี้ใช้ได้สำหรับฉัน
อรุณปราศ ES

1
แน่นอนว่าคุณไม่ควรเก็บรหัสผ่านแบบข้อความในฐานข้อมูลของคุณ อย่างน้อยพวกเขาควรจะถกกันด้วยเกลือและพริกไทยอาจsecurity.stackexchange.com/questions/3272/...
Anders_K

2

เป็นวิธีปฏิบัติที่ดีที่สุดในการระบุคอลัมน์ที่คุณต้องการแทนที่จะระบุ * ดังนั้นคุณควรระบุเขตข้อมูลที่คุณต้องการให้คุณเลือกที่จะกลับมา


2

เพื่อนร่วมงานแนะนำทางเลือกที่ดี:

  • ทำ SELECT INTO ในเคียวรีก่อนหน้าของคุณ (ที่คุณสร้างหรือรับข้อมูลจาก) ลงในตาราง (ซึ่งคุณจะลบเมื่อเสร็จสิ้น) สิ่งนี้จะสร้างโครงสร้างให้คุณ
  • ทำสคริปต์เป็น CREATE ไปที่หน้าต่างแบบสอบถามใหม่
  • ลบคอลัมน์ที่ไม่ต้องการ จัดรูปแบบคอลัมน์ที่เหลือลงใน 1 ซับและวางเป็นรายการคอลัมน์ของคุณ
  • ลบตารางที่คุณสร้าง

เสร็จสิ้น ...

สิ่งนี้ช่วยเราได้มาก


1

คลิกขวาที่ตารางใน Object Explorer เลือก 1,000 แถวบนสุด

มันจะแสดงรายการคอลัมน์ทั้งหมดและไม่ใช่ * จากนั้นลบคอลัมน์ที่ไม่ต้องการ ควรจะเร็วกว่าการพิมพ์ด้วยตัวคุณเอง

จากนั้นเมื่อคุณรู้สึกว่ามันทำงานหนักเกินไปให้รับพรอมต์ SQL ของ Red Gate และพิมพ์ ssf จาก tbl ไปที่แท็บ * แล้วคลิกอีกครั้ง


1

สิ่งที่ฉันใช้บ่อยสำหรับกรณีนี้:

declare @colnames varchar(max)=''

select @colnames=@colnames+','+name from syscolumns where object_id(tablename)=id and name not in (column3,column4)

SET @colnames=RIGHT(@colnames,LEN(@colnames)-1)

@colnames ดูเหมือนกับ column1,column2,column5


1

บางครั้งโปรแกรมเดียวกันต้องจัดการกับฐานข้อมูลต่างกัน ดังนั้นฉันไม่สามารถใช้รายการคอลัมน์ในโปรแกรมเพื่อหลีกเลี่ยงข้อผิดพลาดในselectคำสั่ง

*ให้ฉันเลือกฟิลด์ทั้งหมด ฉันจะตรวจสอบว่าเขตข้อมูลที่มีอยู่ในตารางข้อมูลก่อนการใช้งาน นี่คือเหตุผลของฉันสำหรับใช้ใน*select

นี่คือวิธีที่ฉันจัดการฟิลด์ที่แยก:

Dim da As New SqlDataAdapter("select * from table", cn)
da.FillSchema(dt, SchemaType.Source)
Dim fieldlist As String = ""
For Each DC As DataColumn In DT.Columns
   If DC.ColumnName.ToLower <> excludefield Then
    fieldlist = fieldlist &  DC.Columnname & ","
   End If
  Next

พิจารณาอย่างละเอียด / ชี้แจงคำถาม / ปัญหาของคุณ
badfilms

1

ฉันรู้ว่าคำถามนี้เก่า แต่ฉันหวังว่านี้ก็ยังคงเป็นคำตอบ helpful.The เป็นแรงบันดาลใจโดยหารือจากSQL Server ฟอรั่ม คุณสามารถทำให้ขั้นตอนนี้ถูกเก็บไว้ได้ นอกจากนี้ยังสามารถแก้ไขเพื่อเพิ่มมากกว่าหนึ่งยกเว้นฟิลด์

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name not in ('colName1','colName2') and object_id = (Select id from sysobjects where name = 'tblName')
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
EXEC sp_executesql  @SQL

0

การทำสิ่งนี้ทำได้ง่ายกว่า:

sp_help <table_name>

- คลิกที่คอลัมน์ 'Column_name'> คัดลอก> วาง (สร้างรายการแนวตั้ง) ลงในหน้าต่างแบบสอบถามใหม่และเพียงพิมพ์เครื่องหมายจุลภาคหน้าค่าคอลัมน์แต่ละคอลัมน์ ... แสดงความคิดเห็นคอลัมน์ที่คุณไม่ต้องการ ... ไกลน้อยกว่า พิมพ์ได้มากกว่ารหัสใด ๆ ที่เสนอที่นี่และยังสามารถจัดการได้


"พิมพ์น้อยกว่ารหัสใด ๆ ที่มีให้ที่นี่" และยุ่งยากมากกว่าการลากโหนดคอลัมน์ลงในตัวแก้ไขแบบสอบถามหรือวิธีอื่น ๆ ที่เหนือกว่าในการรับรายการ ฉันหมายถึงตารางที่มีคอลัมน์ 10s จำนวนมาก
underscore_d

0

คุณสามารถรับ SQL Complete จาก devart.com ซึ่งไม่เพียง แต่ขยาย * wildcard เช่นเดียวกับ SQL Prompt จาก Red Gate ไม่ (ดังอธิบายในคำตอบของ cairnz) แต่ยังมีตัวเลือกคอลัมน์แบบหล่นลงพร้อมช่องทำเครื่องหมายที่คุณสามารถตรวจสอบทั้งหมด คอลัมน์ที่คุณต้องการในรายการที่เลือกและพวกเขาจะถูกแทรกโดยอัตโนมัติสำหรับคุณ (และถ้าคุณยกเลิกการเลือกคอลัมน์มันจะถูกลบโดยอัตโนมัติจากรายการที่เลือก)


0

ใน SSMS มีวิธีที่ง่ายขึ้นด้วยIntelliSenseและแฝง ลองสิ่งนี้

  1. คลิกขวาในเท็กซ์เอดิเตอร์และตรวจสอบให้แน่ใจว่าเปิดใช้งาน IntelliSense
  2. พิมพ์แบบสอบถามด้วยนามแฝง [SELECT t. * FROM tablename t]
  3. ไปข้อความt. *และลบ*และ SSMS ประสงค์อัตโนมัติรายการคอลัมน์ของตาราง aliased
จากนั้นคุณสามารถระบุเฉพาะคอลัมน์ที่คุณต้องการ โดยไม่ต้องใช้ SSMS เพื่อเขียนตัวเลือกไปยังสคริปต์อื่นแล้วทำการคัดลอก / วางเพิ่มเติม ฉันใช้สิ่งนี้ตลอดเวลา


คุณช่วยระบุคำตอบสำหรับการยกเว้นคอลัมน์ได้ไหม?
Kamiccolo

@Kamiccolo - สิ่งที่กำลังถูกอธิบายโดย DuckWork คือการกระทำด้วยตนเอง การตัดและวางชื่อคอลัมน์ที่ต้องการ เขาแค่บอกว่านี่เป็นวิธีที่จะหาชื่อได้ง่ายขึ้นโดยไม่ต้องพิมพ์อะไรมากมาย ไม่ช่วยให้คุณเขียนแบบสอบถามที่ระบุว่า "ยกเว้นคอลัมน์นี้" มันช่วยให้คุณสร้างรายการคอลัมน์ที่ต้องการซึ่งคุณจะวางลงในคิวรีของคุณ
ToolmakerSteve
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.