มีความแตกต่างระหว่างการวางนามแฝงคอลัมน์ที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำนิยามคอลัมน์หรือไม่?


12

ฉันเคยเห็นและเขียนชื่อแทนคอลัมน์เป็นเสมอ

SELECT 1 as ColumnName

แต่วันนี้เจอคำถามที่ใช้

SELECT ColumnName = 1

มีความแตกต่างในวิธีการเรียกใช้แบบสอบถามทั้งสองนี้อย่างไร หรือมีมาตรฐานในกลุ่ม DBA เกี่ยวกับอันไหนที่จะใช้?

ส่วนตัวผมคิดว่า 2 จะง่ายต่อการอ่าน / รักษาสำหรับคำจำกัดความคอลัมน์อีกต่อไป (ตัวอย่างที่ดีที่นี่จากบทความนี้ ) แต่ผมไม่เคยเห็นไวยากรณ์ที่ 2 ก่อนที่จะนำมาใช้ในวันนี้เพื่อให้กำลังสงสัยว่าถ้ามีเหตุผลบางอย่างที่ฉันไม่ควรจะเป็น ใช้มัน


2
โปรดทราบว่ารูปแบบการกำหนดนามแฝงความคิดเห็นไม่ใช่แบบพกพาดังนั้นแม้ว่ามันจะทำให้อ่านค่อนข้างง่ายเมื่อคุณทำงานคอลัมน์ที่ได้รับจำนวนมาก แต่ก็น่ารำคาญที่ต้องแปลงในภายหลังเป็น DBMS อื่น
เคดรูส์

@ เคด Celko โต้เถียงเกี่ยวกับบางสิ่งบางอย่างตลอดเวลา ถ้าฉันต้องแปลงฐานข้อมูล SQL Server เป็น Oracle หรือ PG หรือ MySQL องค์ประกอบของนามแฝงจะเป็นสิ่งที่ฉันกังวลน้อยที่สุด เนื่องจากไม่เหมือน Celko ฉันจึงไม่สนใจที่จะหลีกเลี่ยงคุณสมบัติที่เป็นกรรมสิทธิ์ทั้งหมดในกรณีที่เราย้ายสถาปัตยกรรมทั้งหมดของเราไปยัง RDBMS ที่แตกต่างกัน ฉันสงสัยว่ามันเกิดขึ้นได้บ่อยแค่ไหนนอกห้องเรียน ...
Aaron Bertrand

@AaronBertrand ฉันเห็นด้วยกับการแปลงมวล ฉันแปลงสิ่งต่าง ๆ เป็นเทราดาต้าและนี่เป็นปัญหาที่น้อยที่สุด สิ่งที่เกิดขึ้นกับฉันบ่อยขึ้นคือฉันจะนำเข้าข้อมูลตารางดิบทั้งหมดไปยัง SQL Server ของฉันและสร้างมุมมองหรือแบบสอบถามบนมันหรือสิ่งที่ฉันทำเพื่อวิเคราะห์มันแล้วฉันจะเขียนแบบสอบถามหรือ proc สำหรับแหล่งที่มา ระบบภาษาที่จะเรียกจาก SSIS หรืออะไรก็ตามที่จะได้รับเพียงแค่ข้อมูลที่ฉันต้องการข้ามสาย ในกรณีเหล่านั้นฉันตั้งใจเขียน SQL แบบ ANSI ทั่วไปมาก แล้วฉันยังต้องเปลี่ยนสิ่งต่าง ๆ เช่นฟังก์ชั่นวันที่
เคด Roux

คำตอบ:


17

ไม่มีความแตกต่างในฟังก์ชันการทำงานพื้นฐานของ aliasing สองประเภท ( asตรงข้ามกับ=) สิ่งที่ควรคำนึงถึงคือสิ่งที่คุณพูดถึง: ความสามารถในการอ่านและการบำรุงรักษา

ในความคิดของฉันอดีต ( <Expression> as <Alias>) สามารถอ่านได้มากขึ้นเพราะมันเป็นคำอธิบายตัวเอง เมื่อคุณมีSELECT ColumnName = 1ฉันคิดว่ามันคงจะง่ายที่จะเข้าใจผิดว่าเป็นการตั้งค่าตัวแปรในคืนที่เหนื่อยล้า คุณอาจเข้าใจผิดว่าเป็นSELECT @ColumnName = 1และนั่นจะเป็นการทำงานที่แตกต่างอย่างสิ้นเชิง ดังนั้นเพื่อหลีกเลี่ยงความเป็นไปได้ของข้อความค้นหา "double double" หรือแย่กว่านั้น ... ข้อผิดพลาดในการทำความเข้าใจ / การเขียนโค้ดฉันไปด้วยSELECT 1 as ColumnName100% ของเวลา

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

<Expression> <Alias>วิธีที่ไม่ได้กล่าวถึงที่สามคือการใช้งาน ในคำอื่น ๆ วิธีที่สองของคุณไม่มีasคำหลัก ฉันคิดว่ามันแย่เหมือน=สัญลักษณ์ มันขาดความสามารถในการอ่านที่ได้รับจากอะไร ไม่พิมพ์อักขระพิเศษสามตัว ( asและเว้นวรรค) ไม่คุ้มค่า

เพื่อวัตถุประสงค์ในการพูดเกินจริงลองดูที่แบบสอบถามเช่นนี้:

use AdventureWorks2012;
go

select
    [New Name] = Name,
    NewDepId = DepartmentID,
    GroupName as GName,
    ModifiedDate MyModDate
from HumanResources.Department;

ไม่ใช่รหัสที่ฉันต้องการตรวจสอบ


5
มันทำให้ฉันรำคาญที่จะเห็นคนสุดท้ายที่พวกเขาไม่รวมคำหลัก "เป็น" ไม่จำเป็น แต่ต้องเจ็บปวดเมื่ออ่านรหัส

10

โดยส่วนตัวฉันalias = expressionอ่านและเข้าใจง่ายกว่า เหตุผลก็คือเมื่อฉันแก้ไขปัญหาSELECTคำสั่งที่มีนิพจน์ที่มีความยาวฉันอาจต้องการค้นหานิพจน์ผ่านชื่อคอลัมน์ไม่ใช่วิธีอื่น ด่วนค้นหานิพจน์ที่แอปพลิเคชันเห็นว่าเป็นalias2:

SELECT
  alias1 = (long expression with aggregates and multiple column references),
  (long expression with aggregates and multiple column references AS alias2
FROM ...

นั่นคือความชอบของฉัน ของคุณอาจจะแตกต่างกัน ไม่มีประโยชน์ที่แท้จริงในการใช้อย่างใดอย่างหนึ่งยกเว้นเหตุผลส่วนตัว / เหตุผล สิ่งสำคัญคือคุณเลือกวิธีหนึ่งที่จะทำและทำอย่างสม่ำเสมอ (และถ้าคุณไม่พลิกเหรียญคุณสามารถปกป้องตัวเลือกของคุณเมื่อคุณเจอคนที่ชอบวิธีอื่น) แต่ถ้าคุณเขียนโค้ดสำหรับ DBA อย่างจุกจิกเหมือนฉันให้เตรียมมันใหม่เพื่อเขียนใหม่ :-)

ฉันได้ blogged เกี่ยวกับเรื่องนี้

สิ่งหนึ่งที่ฉันรู้สึกแข็งแกร่งยิ่งขึ้นเกี่ยวกับการใช้คำพูดเดียวรอบชื่อนามแฝงเช่น

column AS 'alias'
'alias' = column

รูปแบบเดียวเลิกใช้แล้ว แต่ทั้งคู่อ่านยากมาก - และมือใหม่จำนวนมากเข้าใจผิดว่านามแฝงเป็นตัวอักษรสตริงเนื่องจากนั่นคือสิ่งที่ดูเหมือน ด้วยเหตุผลเดียวกันฉันเกลียดการใช้เครื่องหมายคำพูดคู่ ( "alias") อย่างแน่นอน [square brackets]หากคุณต้องการที่จะหลบหนีนามแฝงของคุณเพราะมันเป็นคำสงวนหรือมิฉะนั้นจะได้รับการแต่งตั้งไม่ดีหรือการจัดรูปแบบการใช้งาน


2
เห็นด้วยอย่างยิ่งในด้านคำพูด สำหรับนิพจน์แบบยาวสิ่งที่ฉันทำเองคือใช้การขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่จากนั้นใส่as <Alias>บรรทัดสุดท้ายของคำจำกัดความของคอลัมน์ แต่เห็นด้วยอย่างแน่นอนมันเป็นเรื่องส่วนตัวเหมือนที่คุณชอบกาแฟของคุณ
Thomas Stringer

@ThomasStringer เห็นไหมว่าฉันอยากให้รถคืน หากบรรทัดเริ่มต้นด้วยAS Aliasสิ่งASนั้นไม่มีประโยชน์มากเมื่อฉันกำลังสแกนในแนวตั้งเพื่อหาชื่อตารางเฉพาะ ฉันพนันว่าเราไม่เห็นด้วยกับการใส่เครื่องหมายจุลภาคด้วย :-)
Aaron Bertrand

ฉันพยายามใช้อัญประกาศเดี่ยวล้อมรอบคอลัมน์ชื่อแทนของฉันเพียงครั้งเดียวเพราะมันทำให้พวกเขาเป็นสีแดงซึ่งโดดเด่นใน SSMS แต่ความน่ารำคาญของการพิมพ์รหัสคำพูดนั้นกลายเป็นเรื่องที่รวดเร็วเกินไปสำหรับฉัน นอกจากนี้มันใช้งานไม่ได้ตามวัตถุประสงค์ที่ตั้งใจไว้เมื่อฉันมีสตริงในข้อความค้นหาของฉัน ฉันอาจจะติดASเนื่องจากเป็นสิ่งที่เราใช้ตอนนี้ (ฉันมักจะเพิ่มขึ้นบรรทัดใหม่ก่อนAS ColumnNameเพื่อให้พวกเขาแถวขึ้นคร่าว ๆ ) แต่ฉันเห็นด้วยที่=มากขึ้นสามารถอ่านได้ในคำจำกัดความคอลัมน์อีกต่อไป
Rachel

2
@AaronBertrand อาร์กิวเมนต์ของฉันในการใส่เครื่องหมายจุลภาคก่อนคือทำให้ง่ายขึ้นที่จะบอกว่าคำจำกัดความของคอลัมน์เริ่มต้นที่ใดโดยเฉพาะอย่างยิ่งกับคำจำกัดความของคอลัมน์หลายบรรทัด
Rachel

1
@AaronBertrand ฉันมักจะไม่ทำงานกับรหัสเยื้องอย่างสมเหตุสมผล>. <
Rachel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.