Làm thế nào để đối phó với các tên cột SQL trông giống như các từ khóa SQL?


226

Một trong những cột của tôi được gọi from. Tôi không thể thay đổi tên vì tôi đã không làm cho nó. Tôi có được phép làm một cái gì đó giống như SELECT from FROM TableNamehoặc có một cú pháp đặc biệt để tránh SQL Server bị nhầm lẫn không?


3
Tôi muốn sử dụng dấu ngoặc kép của ANSI SQL cho các định danh được phân tách. Nó sẽ hoạt động trên hầu hết mọi dbms, kể cả SQL Server. Tức là chỉ cần làm SELECT "from" FROM TableName, tốt đẹp và di động!
jarlh

Câu trả lời:


354

Bọc tên cột trong ngoặc như vậy, fromtrở thành [từ].

select [from] from table;

Cũng có thể sử dụng như sau (hữu ích khi truy vấn nhiều bảng):

select table.[from] from table;

10
Còn về: select TableName.from from TableName; PS: Nó hoạt động trong MySQL
Fabricio PH

1
Tôi đã thử điều này chỉ sáng nay và dường như nó không hoạt động trong cài đặt MySQL của tôi. Nó là một tham số hoặc một cái gì đó bật nó lên?
CodeChimp

@CodeChimp - hãy thử sử dụng backticks, stackoverflow.com/questions/2901453/ Khăn Câu hỏi / câu trả lời này dành riêng cho MS SQL Server.
tvanfosson

Đúng, nhưng @FovenioPH đã đề cập đến nó hoạt động trong MySQL. Tôi đã xảy ra ở đây từ một tìm kiếm Google sau khi tôi thử điều này trên bản cài đặt MySQL cục bộ của tôi. Tôi đang tìm kiếm để xem liệu có một cách thoát ANSI SQL chung như thế nào trong SQL không. Chúng tôi hiện đang sử dụng SQL Server 2005, nhưng chúng tôi cũng có Oracle trong một số ứng dụng khác. Chúng tôi muốn mã hóa các DAO Java của chúng tôi theo cách mà nếu chúng tôi được yêu cầu chuyển từ SQL Server sang một thứ khác, nó sẽ chỉ "hoạt động".
CodeChimp

@CodeChimp Tôi có thể đếm số lần xảy ra với tôi mà không có ngón tay. :)
tvanfosson

25

Nếu nó đã có trong PostgreSQL, hãy sử dụng dấu ngoặc kép quanh tên, như:

select "from" from "table";

Lưu ý: Nội bộ PostgreSQL tự động chuyển đổi tất cả các lệnh và tham số không được trích dẫn thành chữ thường. Điều đó có tác dụng là các lệnh và mã định danh không phân biệt chữ hoa chữ thường. sEleCt * từ tAblE; được hiểu là select * từ bảng; . Tuy nhiên, các tham số bên trong dấu ngoặc kép được sử dụng nguyên trạng và do đó có phân biệt chữ hoa chữ thường: select * từ "bảng"; chọn * từ "Bảng"; nhận được kết quả từ hai bảng khác nhau.


Các dấu ngoặc kép cũng hoạt động cho MS SQL, không có độ nhạy trường hợp. Các định danh được trích dẫn chỉ là, AFAIK, một sự thay thế tương đương với các định danh được phân định bằng dấu ngoặc.
P Daddy

Dấu ngoặc kép cũng hoạt động cho công cụ truy vấn Presto SQL được sử dụng bởi Athena của Amazon.
Will Humphreys

21

Trong khi bạn đang thực hiện - bí danh nó là một cái gì đó khác (hoặc tốt hơn nữa, hãy sử dụng chế độ xem hoặc SP và không dùng phương thức truy cập trực tiếp cũ).

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName

14

Đây là hai cách để làm điều đó:

  1. Sử dụng lại trích dẫn như ở đây:

CHỌN `từ` TỪ Tên bảng

  1. Bạn có thể đề cập với tên bảng là:

SELECT TableName.from FROM TableName


Cảm ơn! Điều này đã lưu truy vấn trang tính google của tôi đã cố gắng kéo từ cột BY
Paul

1
Cảm ơn, cú pháp dấu ngoặc kép và dấu ngoặc vuông không hoạt động với máy khách của tôi (MySQLWorkbench) nhưng phương pháp đánh dấu lại đã làm.
kingInTheNorth

10

Câu hỏi của bạn dường như được trả lời tốt ở đây, nhưng tôi chỉ muốn thêm một bình luận cho chủ đề này.

Những người thiết kế cơ sở dữ liệu nên nhận thức rõ các từ khóa dành riêng và tránh sử dụng chúng. Nếu bạn phát hiện ra ai đó sử dụng nó, hãy thông báo cho họ về điều đó (một cách lịch sự). Các từ khóa ở đây là từ dành riêng .

Thêm thông tin:

"Không nên sử dụng từ khóa dành riêng làm tên đối tượng. Cơ sở dữ liệu được nâng cấp từ các phiên bản SQL Server trước đó có thể chứa các định danh bao gồm các từ không dành riêng trong phiên bản trước, nhưng đó là các từ dành riêng cho phiên bản SQL Server hiện tại. Bạn có thể tham khảo đối tượng bằng cách sử dụng các định danh phân cách cho đến khi tên có thể được thay đổi. " http://msdn.microsoft.com/en-us/l Library / ms176027.aspx

"Nếu cơ sở dữ liệu của bạn có chứa các tên khớp với các từ khóa dành riêng, bạn phải sử dụng các định danh được phân tách khi bạn tham chiếu đến các đối tượng đó. Để biết thêm thông tin, hãy xem Mã định danh (DMX)." http://msdn.microsoft.com/en-us/l Library / ms132178.aspx


2
Tốt hơn LUÔN LUÔN sử dụng dấu ngoặc cho các đối tượng cơ sở dữ liệu của bạn.
đập

8

Nếu bạn đang sử dụng SQL Server, bạn chỉ cần bọc dấu ngoặc vuông quanh cột hoặc tên bảng.

select [select]
from [table]

5

Trong Apache Drill, sử dụng backquote:

select `from` from table;

3

Tôi cũng đã phải đối mặt với vấn đề này. Và giải pháp cho việc này là đặt [Cột_Name] như thế này trong truy vấn.

string query= "Select [Name],[Email] from Person";

Vì vậy, nó sẽ hoạt động hoàn toàn tốt.


3

Xin chào Tôi làm việc trên các hệ thống Teradata hoàn toàn tuân thủ ANSI. Sử dụng dấu ngoặc kép "" để đặt tên cho các cột như vậy.

Ví dụ: typemột từ khóa dành riêng SQL và khi được sử dụng trong dấu ngoặc kép, typeđược coi là tên do người dùng chỉ định.

Xem ví dụ mã dưới đây:

CREATE TABLE alpha1
AS
(
SEL
product1
type_of_product AS "type"
FROM beta1
) WITH DATA
PRIMARY INDEX (product1)

--type is a SQL reserved keyword

TYPE

--see? now to retrieve the column you would use:

SEL "type" FROM alpha1

Tôi xác nhận điều này hoạt động trong DBeaver với cơ sở dữ liệu Teradata, cảm ơn!
Paul

1

Bạn có thể đặt tên cột của bạn trong ngoặc như:

Select  [from] from < ur_tablename>

Hoặc là

Đặt trong một bảng tạm thời sau đó sử dụng như bạn muốn.
Thí dụ:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Ở đây tôi chỉ giả sử rằng your_tablename chỉ chứa một cột (tức là từ).


3
Điều đó giả định rằng đó [from]là cột duy nhất your_tablenameđã có.
Andriy M

Bạn đạt được gì từ bảng tạm thời? Có vẻ như hoàn toàn vô dụng, không có gì để làm với câu hỏi cả.
rjmunro

@rjmunro, không, điều này dường như không hoàn toàn vô dụng. Tôi có một trường hợp tôi truy vấn một khối bảng từ SQL và nó trả về tên của các cột như '[Total].' Đó là, tên của chính nó chứa '[' và ']'. Bạn không thể sử dụng [[Tổng số]] và [Tổng số] để truy xuất một cột như vậy. Cách dễ nhất là đặt kết quả của truy vấn vào bảng tạm thời.
darlove

@darlove Bạn không thể sử dụng dấu ngoặc kép : "[Total]"? Hoặc có thể có một cách để thoát khỏi nó, một cái gì đó như thế [\[Total\]]nào?
rjmunro

@rjmunro, sau khi thử nghiệm điều này một chút, tôi đã tìm thấy một cách khác mà tôi không biết: bạn có thể đặt QUOTED_IDENTIFIER thành BẬT và sau đó sử dụng những gì bạn đang nói, trích dẫn kép ". cách nhưng tôi sẽ không loại bỏ hoàn toàn tùy chọn bảng tạm thời.
darlove

1

Tôi đã chạy trong cùng một vấn đề khi cố gắng cập nhật một cột có tên là một từ khóa . Giải pháp trên không giúp tôi được gì. Tôi đã giải quyết nó bằng cách chỉ định tên của bảng như thế này:

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')


1

Trong MySQL, thay vào đó là sử dụng dấu ngoặc kép ngược (`), bạn có thể sử dụng UI để thay đổi tên cột. Nhấp chuột phải vào bảng> Bảng thay đổi> Chỉnh sửa tên cột có chứa từ khóa sql> Cam kết.

select [from] from <table>

Lưu ý, ở trên không hoạt động trong MySQL


1

Đánh giá từ các câu trả lời ở đây và kinh nghiệm của riêng tôi. Câu trả lời duy nhất có thể chấp nhận được, nếu bạn dự định di động là không sử dụng từ khóa SQL cho bảng, cột hoặc tên khác.

Tất cả các câu trả lời này hoạt động trong các cơ sở dữ liệu khác nhau nhưng dường như rất nhiều không hỗ trợ giải pháp ANSI.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.