Postgres 14.
Are there any forbidden characters in aliasing columns?
I want to see '$' in column's name and it doesn't work. How can I get it done? Is there any magic function that could do that for me?
SELECT
id,
currency as '$',
available
from f_total
ORDER BY
id DESC
;
gives:
ERROR: syntax error at or near "'$'"
LINE 3: currency as '$',
^
SQL state: 42601
Character: 27
Same story when I use '€', '!', '<'. I expected it to be not executed against all syntax-verificators - it's just an insignificant string to be used on output ...
How to make my column to be named with such name?
Use double-quotes (") for identifiers:
currency AS "$"
See:
Are PostgreSQL column names case-sensitive?
Every string is allowed once double-quoted (with contained double-quotes doubled up). Doesn't mean it's a good idea to use "$" as identifier. It isn't.
I want to use special characters in BigQuery columns but when using it it is throwing error as : Syntax error: Expected end of input but got "/" at [2:16].
Query :
SELECT *,
buget as budget/bin
FROM `dummy.book1`
Thanks
I don't think that's possible. BQ has column name naming rules so even when you do SELECT x AS y, y still has to follow those rules
In a PGSQL query one might use double-quotes to escape a column or table name that happens to be a reserved word, like so
select "name" from sometable;
This is often combined with C#, and the escaping must itself be escaped.
string sql = "select \"name\" from sometable;";
However, there is another C# trick that I would like to use to allow line breaks in my SQL for legibility, like so:
string sql = #"
select
foo
from
sometable;";
And here we come unglued: you can't use backslashes to escape double-quotes in a string in which backslashes and linebreaks are treated as literals.
Generally I exploit the fact that dot notation makes the escaping unnecessary.
string sql = #"
select
x.name
from
sometable as x;";
But what of tables with reserved words for names?
string sql = #"
select
foo
from
user;";
Putting aside my burning desire to thump the person who keeps using reserved words for column and table names, I ask for alternate syntax. I tried the widely used square bracket syntax.
string sql = #"
select
foo
from
[user];";
But PGSQL seems to be unhelpful there.
I did find a workaround: dot notation again.
string sql = #"
select
foo
from
public.user;";
But the question stands: alternate notation?
There is no alternative to double quotes for quoting identifiers. You will have to pay the price for the bad design choice of choosing identifiers that are not standard compliant.
In my SQL Server database table there is one variable with spaces. I am trying to write one query in the RODBC::sqlQuery function but I am not able to use this variable.
I tried to use single quotes but that doesn't work.
I tried to use paste option and create one string for query but even that also did not work.
Following is the query:
p5 <-sqlQuery(con, 'SELECT
a.region,
a.Country,
a.Qtr_ID,
Net_VAT AS Variable_Type,
"Printing" AS [External_Segment],
SUM(a.VR_Value) AS Value
FROM
(SELECT
d.region,
d.Country,
dt.Qtr_ID,
SUM([Actuals YTD] / 1000000) AS VR_Value
FROM ZOOM_DATAMART.dbo.[New_BalSheet_Fact] a
INNER JOIN [dbo].[Buss_Area_Dim_V] b
ON a.Bus_Area_ID = b.Bus_Area_ID
AND b."GBU External Segment Description" = "Printing"
INNER JOIN [dbo].[BSR_Header_GA_Dim_V] c
ON a.BSR_HEADER_GA_KEY = c.BSR_HEADER_GA_KEY
AND c.[Group Account Identifier] IN (1291, 2150, 2151,
2152, 2153, 2154)
INNER JOIN [dbo].[Legal_Company_Dim_V] d
ON a.Legal_Cmp_Key = d.Legal_Cmp_Key
INNER JOIN dbo.Date_Dim dt
ON a.Date_key = dt.Date_key
AND dt.Max_month_Flag = 1
GROUP BY d.region,
dt.Qtr_ID,
d.Country
) a
GROUP BY a.region,
a.Country,
a.Qtr_ID)
The issue is happening with "GBU External Segment Description". I get following error:
chr [1:4] "42S22 207 [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Printing'." ...
Then I removed double quote from printing but still for "GBU External Segment Description" it doesn't accept and throws following error:
chr [1:3] "42000 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'GBU External Segment Description'." ...
The error is not with the fieldname I believe, but with the varchar constant that you are looking for. You should be using single quotes, not double.
This:
a.Bus_Area_ID = b.Bus_Area_ID and b."GBU External Segment Description"= "Printing"
Should be this:
a.Bus_Area_ID = b.Bus_Area_ID and b.[GBU External Segment Description] = 'Printing'
Generally, String values in SQL are not wrapped in double quotes, but single quotes.
Also, in your first line:
p5 <-sqlQuery(con,'SELECT a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,"Printing" as [External_Segment]
Are you trying to output Printing as a constant result from this query? If so, and it is not a field name, then you should also wrap that in ' single quotes, not double. That is likely what is cauing the first error that you are seeing.
So that it becomes:
p5 <-sqlQuery(con,'SELECT a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,'Printing' as [External_Segment]
The previous comment on your question about wrapping fieldnames with [] is correct, you should use [] the square brackets to wrap field names with spaces in them.
This query should work:
p5 <-sqlQuery(con,'SELECT a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,\'Printing\' as [External_Segment]
,SUM(a.VR_Value) as Value
from
(SELECT d.region,d.Country,dt.Qtr_ID
,sum([Actuals YTD]/1000000) as VR_Value
FROM ZOOM_DATAMART.dbo.[New_BalSheet_Fact] a
inner join [dbo].[Buss_Area_Dim_V] b
on
a.Bus_Area_ID = b.Bus_Area_ID and b.[GBU External Segment Description]= \'Printing\'
inner join [dbo].[BSR_Header_GA_Dim_V] c
on
a.BSR_HEADER_GA_KEY= c.BSR_HEADER_GA_KEY and c.[Group Account Identifier] IN (1291,2150,2151,2152,2153,2154)
inner join [dbo].[Legal_Company_Dim_V] d
on a.Legal_Cmp_Key = d.Legal_Cmp_Key
inner join dbo.Date_Dim dt
on a.Date_key = dt.Date_key and dt.Max_month_Flag = 1
group by d.region,
dt.Qtr_ID
,d.Country
) a
Group BY
a.region
,a.Country
,a.Qtr_ID')
Hope this helps.
Overall, your main issue involves confusing and conflating identifiers and literals. As information, in ANSI-SQL (the formal, industry standard of the SQL language that most RDBMS's adhere to including SQL Server, Oracle, Postgres, etc.), single quotes and double quotes are used for different purposes.
Single quotes are used to enclose string literals within char, varchar, text data type columns such as 'Printing'. Your first error message actually points to Printing as the MSSQL engine attempted to search for a column name since you wrapped this value in double quotes.
Double quotes are used for identifiers including column names and table names such as c."Group Account Identifier". Your second error points to the use of qualifying a table alias, c, to a literal value since you wrapped this value in single quotes.
Below are few common uses of this type:
Double quotes explicitly impose case sensitivity. Specifically, when you wrap column names in double quotes, the same characters in camel case, lower case, and upper case render different values and an error will raise if they do not align to the actual case used in table creation (i.e., tbl."ColumnName" <> tbl."COLUMNNAME").
Double quotes help escape special characters (!##$%^&*?) and spaces. Hence, you can use c."Group Account Identifier" to identify the column. However, some RDBMS's have their own escaping symbols for special characters and spaces which are not ANSI standards. For example, SQL Server can use square brackets [...]; MySQL can use backticks `...`; SQLite and MS Access can use both.
Double quotes help escape reserved words of the current RDBMS which for you includes SQL Server's list. However, it is advised not to use such words, special characters, accents, or spaces in column names.
With that said, like any rule there are exceptions. Both types of quotes may be used with string literals for some databases that allow non-ANSI modes. However, this is not advised to do in practice. Unlike most programming languages such as R, Python, PHP, Perl, XSLT that can swap these two types of quotes for string values, SQL at its base core is not one of them.
Therefore, use either quote type accordingly:
'Printing' AS "External_Segment",
...
AND b."GBU External Segment Description" = 'Printing'
...
AND c."Group Account Identifier" IN (1291, 2150, 2151, 2152, 2153, 2154)
Or
'Printing' AS [External_Segment],
...
AND b.[GBU External Segment Description] = 'Printing'
...
AND c.[Group Account Identifier] IN (1291, 2150, 2151, 2152, 2153, 2154)
I have this portion of a Oracle SQL query (lots more above it that doesn't apply to the question)
...
authorw as (
select a.id, (sum(p.w)) "theWeightOfTheAuthor"
from ac a, pc p, authorpublication ap
where a.id = ap.aid and ap.pid = p.id
group by a.id)
select authorCount.id "ID", auth.name "NAME", authorCount.c "TOTAL_NUMBER_OF_PUBS",
athw.theWeightOfTheAuthor "W_SCORE",
(authorCount.C / athw.theWeightOfTheAuthor) "MULT"
from ac authorCount, authorw athw, Author auth
where authorCount.id = athw.id and authorCount.id = auth.id
order by TOTAL_NUMBER_OF_PUBS desc;
where I am receiving an error:
ORA-00904: "ATHW"."THEWEIGHTOFTHEAUTHOR": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 404 Column: 22
Line 404 being the fourth from last line:
(authorCount.C / athw.theWeightOfTheAuthor) "MULT"
NOTE: I can access athw.id just fine, and if I execute up to the authorw creation, the table is printed out correctly with the theWeightOfTheAuthor column as expected. What gives?
Either remove the quotes around "theWeightOfTheAuthor" when you define it, or add quotes when you use it. Quoting the name when defining it makes the name case-sensitive, and because Oracle changes all non-quoted identifiers to UPPER CASE, your reference to the field is actually looking for ATHW.THEWEIGHTOFTHEAUTHOR, which doesn't exist.
A basic rule of Oracle programming is - never quote identifiers. It's a pain. Just don't do it.
Best of luck.
You've specified the column alias in double quotes, with mixed case, as "theWeightOfTheAuthor". When you use double quotes for a column name, Oracle preserves case. When you refer to it without quotes, as athw.theWeightOfTheAuthor, Oracle automatically converts it to upper-case. So the two don't match.
My suggestion is to remove the double quotes from the alias, so it will also be interpreted as upper-case. Alternatively, you could use double quotes for all references to this column, but I don't see any benefit to using mixed case in the column name. (You can still write it as mixed case, for readability, but Oracle will see it as all upper case.)