Bir sütun diğer adını sütun tanımının başına veya sonuna koymak arasında bir fark var mı?


12

Sütun takma adımı her zaman şu şekilde gördüm ve yazdım:

SELECT 1 as ColumnName

ama bugün kullanılan bir sorguya rastladım

SELECT ColumnName = 1

Bu iki sorgunun yürütülmesinde bir fark var mı? Yoksa DBA'lar arasında hangisinin kullanılacağına dair bir standart var mı?

Şahsen ben 2 / okuma (örnek daha uzun sütun tanımları için muhafaza etmek kolay olacağını düşünüyorum buradan itibaren bu makalede ben olmamalı bazı neden varsa), ancak bugün çok merak ediyorum önce kullanılan 2 sözdizimi görmedim kullanarak.


2
Yorum diğer adlandırma atama biçiminin taşınabilir olmadığını unutmayın, bu nedenle çok sayıda türetilmiş sütun çalışması yaparken işleri oldukça okunabilir hale getirse de, daha sonra başka bir DBMS'ye dönüştürmek can sıkıcı olabilir.
Cade Roux

@Cade Celko her zaman bazı şeyler hakkında bu tartışmayı yapar. Bir SQL Server kod temeli Oracle veya PG veya MySQL dönüştürmek zorunda kalırsanız, takma kompozisyon benim endişelerim en az olacaktır. Celko'dan farklı olarak, tüm mimarimizi farklı bir RDBMS'ye taşımamız durumunda tüm özel özelliklerden kaçınmak istemiyorum. Bunun sınıf dışında gerçekten ne sıklıkla olduğunu merak ediyorum ...
Aaron Bertrand

@AaronBertrand Toplu dönüşüm konusunda hemfikirim. Bir sürü şeyi Teradata'ya dönüştürdüm ve bu en az sorun. Bana daha sık olmaya devam eden şey, tüm SQL tabloma tüm ham tablo verilerini içe aktaracağım ve üzerinde bir sorgu veya sorgu veya analiz etmek için yaptığım her şeyi yapacağım ve sonra kaynak için bir sorgu veya proc yazacağım sistem lehçesi SSIS'den çağrılacak veya tel üzerinden tam olarak istediğim veriyi SADECE elde edecek ne olursa olsun. Bu durumlarda, bilinçli olarak çok genel ANSI tarzı SQL yazıyorum. Ve sonra hala tarih fonksiyonları gibi şeyleri değiştirmem gerekiyor.
Cade Roux

Yanıtlar:


17

İki tür örtüşme işlevinin altında yatan işlevsellikte hiçbir fark yoktur ( asaksine =). Aşağıya inen şey tam olarak bahsettiğiniz şeydir: Okunabilirlik ve bakım.

Bence eski ( <Expression> as <Alias>) kendini açıklayıcı olduğu için çok daha okunabilir. Elinizdeyken SELECT ColumnName = 1, o uzun yorgun gecelerde bir değişken belirlerken hata yapmanın oldukça kolay olacağını düşünüyorum. Bu şekilde yanlış olabilir SELECT @ColumnName = 1ve bu tamamen farklı bir işlevselliktir. Bu nedenle, "çift bakış" sorgusu herhangi bir olasılığını atlamak için, hatta daha kötü ... anlama / kodlama hatası SELECT 1 as ColumnName, zamanın% 100 ile gitmek .

Kişisel tercih, ancak tutarlılık (kendiniz ve ekibiniz için) kraldır . En kolay bulduğunuz her şeyi yapın. Birisi sorun giderme / inceleme / bakım kodu için ileri geri geçiş yapmaktan daha sinir bozucu bir şey yoktur.

Sözü etmeyen üçüncü yol kullanmaktır <Expression> <Alias>. Başka bir deyişle, asanahtar kelime olmadan ikinci yol . Bence bu =sembol kadar kötü . Ne kazanılırsa okunabilirlikten yoksundur? Ekstra üç karakter ( asve boşluk) yazmamak. Değmez.

Abartma amacıyla, aşağıdaki gibi bir sorguya göz atın:

use AdventureWorks2012;
go

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

İncelemek istediğim kod değil.


5
"as" anahtar kelimesini hariç tuttukları sonuncuyu görmek beni her zaman rahatsız eder. Gerekli değil ama bir grup koda bakarken okumak için bir acı.

10

Şahsen alias = expressionokumayı ve anlamayı daha kolay buluyorum . Bunun nedeni, SELECTuzun ifadeleri olan bir ifadeyi giderirken , muhtemelen ifadeyi sütun adı ile bulmak istiyorum, tersi değil. Çabuk, uygulamanın gördüğü ifadeyi bulun alias2:

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

Bu benim tercihim. Sizinki farklı olabilir. Sübjektif / tat nedenleri dışında birini veya diğerini kullanmanın gerçek bir avantajı yoktur. Önemli olan, bunu yapmanın bir yolunu seçmeniz ve tutarlı bir şekilde yapmanızdır (ve bir madeni parayı çevirmedikçe, diğer yolu seven birine karşı geldiğinizde seçiminizi savunabilmeniz). Ama benim gibi telaşlı bir DBA için kod yazarsanız, yeniden yazılmaya hazır olun. :-)

Bu konuda blog yazdım .

Kendimi daha da güçlü hissettiğim bir şey, takma adlar etrafında tek tırnak kullanılması, ör.

column AS 'alias'
'alias' = column

Bir form kullanımdan kaldırılmıştır, ancak her ikisinin de okunması çok zordur - ve birçok yeni kullanıcı, takma adı dizgi değişmezi olarak karıştırır, çünkü böyle görünür. Aynı nedenlerle, kesinlikle çift tırnak ( "alias") kullanımını nefret ediyorum . Ayrılmış bir kelime olduğu veya başka şekilde kötü seçildiği veya biçimlendirildiği için takma adınızdan kaçmanız gerekiyorsa, kullanın [square brackets].


2
Tırnaklar konusunda tamamen katılıyorum. Uzun ifadeye gelince, kişisel olarak yaptığım şey, satır başı ve satırsonu sekmesini kullanmak ve ardından as <Alias>sütun tanımının son satırına koymaktır . Ama kesinlikle kabul etti, kahvenizi nasıl sevdiğiniz kadar kişisel.
Thomas Stringer

@ThomasStringer bakın, taşıma ifadesini döndürmeyi tercih ederim. Bir satır kapalı başlarsa ile AS Aliaso ASBelirli bir tablo adı için dikey tarıyorum zaman çok kullanışlı değildir. Bahse girerim, virgülleri nereye koyacağımız konusunda aynı fikirde değiliz. :-)
Aaron Bertrand

Bir kez sütun takma adları etrafında tek tırnak kullanmayı denedim çünkü onları SSMS'de öne çıkan Kırmızı yaptı, ancak alıntı anahtarını çok yazmanın sıkıntıları benim için çok fazla oldu ve tembel yollara düştüm. Ayrıca, benim sorgu dizeleri vardı da amaçlanan amaçları için işe yaramadı. Muhtemelen ASşu an kullandığımız şey olduğundan (genellikle daha önce yeni bir satır ekliyorum, AS ColumnNamebu yüzden kabaca sıralanıyorlar ), ancak =daha uzun sütun tanımlarında çok daha okunabilir olduğunu kabul ediyorum .
Rachel

2
@AaronBertrand Virgülleri ilk sıraya koyma konusundaki argümanım, özellikle çok satırlı sütun tanımları ile bir sütun tanımının nerede başladığını anlatmayı kolaylaştırıyor.
Rachel

1
@AaronBertrand Genellikle makul bir şekilde girintili kodla çalışmıyorum>. <
Rachel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.