我有一个表示一组标志的 tinyint 列。假设我想知道是否设置了特定位,我如何在存储过程中执行按位 AND/OR 操作?
SQL-92 标准的第 5.6 节包含规则 10...13,其中未加引号的标识符应大写,因此foo变为FOO但"foo"仍然是foo。
例如,Oracle、IBM DB2、Snowflake和ksqlDB遵守这些规则,但Postgres 、MySQL 或 SQLite 则不遵守这些规则。
问题是,为什么?根据我的理解,在具有大量关键字的语言中可选地引用标识符是有意义的。标识符一致的区分大小写或不区分大小写也是有意义的。但让它依赖于被引用的标识符看起来并不合理。
我缺少什么?
请告诉我如何修改此 SQL 选择以使用数据透视而不是所有 case 语句。
SELECT t.ProjectId,
COALESCE(MAX(ExecutiveChampion), 'n/a'),
COALESCE(MAX(BusinessOwner), 'n/a'),
COALESCE(MAX(BusinessAnalyst), 'n/a'),
COALESCE(MAX(GeneralContractor), 'n/a'),
COALESCE(MAX(PrimaryPM), 'n/a'),
COALESCE(MAX(DevelopmentManager), 'n/a'),
COALESCE(MAX(DevelopmentLead), 'n/a'),
COALESCE(MAX(TDM), 'n/a'),
COALESCE(MAX(PTM), 'n/a')
FROM (
SELECT pl.ProjectId,
CASE WHEN StakeholderCID = 95 THEN FullName ELSE NULL END as 'ExecutiveChampion',
CASE WHEN StakeholderCID = 96 THEN FullName ELSE NULL END as 'BusinessOwner',
CASE WHEN StakeholderCID = 97 THEN FullName ELSE NULL END as 'BusinessAnalyst',
CASE WHEN StakeholderCID = 100 THEN FullName ELSE NULL END as 'GeneralContractor',
CASE WHEN StakeholderCID …Run Code Online (Sandbox Code Playgroud) 我不是数据库管理员——只是一个软件工程师。我想知道是否可以减少以下 T-SQL 查询:
SELECT
SUM(Price * Quantity) as 'Total',
SUM(Price * Quantity) * 0.95,
FROM
SomeTables;
Run Code Online (Sandbox Code Playgroud)
对于这样的事情:
SELECT
SUM(Price * Quantity) as 'Total',
'Total' * 0.95,
FROM
SomeTables;
Run Code Online (Sandbox Code Playgroud)
注意:这只是澄清/支持我的问题的示例。我当前的 SQL 查询比这更大更复杂。
我想知道这个例子
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
Run Code Online (Sandbox Code Playgroud)
cityas的定义在varchar(80) 这里重复。是否有允许不重复的 PostgreSQL 语法varchar(80),仅基于references cities(city)以创建天气表?
我想通过在现有表名的基础上附加后缀来创建一个新表名。Postgres 9.5 PL/pgSQL 函数获取作为regclass类型传入的现有表名,并以字符串形式返回新名称。我format()用来构造新名称,通常会使用%I占位符。只要传入的表名不匹配任何 PL/pgSQL 关键字,这就会起作用。在这种情况下,无论我选择(%I或%s)什么类型的组件,引用都是错误的。
考虑以下函数:
CREATE OR REPLACE FUNCTION make_name(old_name regclass)
RETURNS text
LANGUAGE plpgsql AS
$$
BEGIN
RETURN format('%I_new', old_name);
END;
$$;
Run Code Online (Sandbox Code Playgroud)
进一步假设有两个表:treenode和overlay。为这两个函数调用此函数会产生以下新名称:
SELECT make_name('overlay'::regclass);
make_name
-------------------
"""overlay"""_new
(1 row)
SELECT make_name('treenode'::regclass);
make_name
--------------
treenode_new
(1 row)
Run Code Online (Sandbox Code Playgroud)
事实证明overlay它也是一个 PL/pgSQL 函数(就像format,但treenode不是),它似乎改变了引用行为。如果%s与 一起使用format(),结果将是"overlay"_new。当我使用||运算符时也会发生同样的情况。如果我使用text作为输入参数类型,一切都按预期工作,但我更喜欢使用regclass.
有没有办法用不带引号的关键字匹配regclass表名(例如overlay …
此问题与以下 2 个 SQL 错误有关(我添加的换行符)
MySql.Data.MySqlClient.MySqlException (0x80004005):
Expression #2 of ORDER BY clause is not in SELECT list, references column 'auitool2014.a.prog' which is not in SELECT list;
this is incompatible with DISTINCT
MySql.Data.MySqlClient.MySqlException (0x80004005):
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'H.C51' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
Run Code Online (Sandbox Code Playgroud)
我的问题很容易描述,即使没有发布原始 SQL。我有一个5.7.11-log在 Windows 上运行的 Mysql服务器,我可以SELECT A,B GROUP BY A并且SELECT …
我的 SQL Server 书说你不能在里面运行一个函数EXEC并展示了一个例子:
DECLARE @NumberOfLetters int = 15;
EXEC(‘SELECT LEFT(Name,’ + CAST(@NumberOfLetters AS varchar)
+ ‘) AS ShortName FROM Production.Product’);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为该CAST()函数需要EXEC在行之前完全解析,因此我们可以将代码修改为:
DECLARE @NumberOfLetters AS int = 15;
DECLARE @str AS varchar(255);
SET @str = ‘SELECT LEFT(Name,’ + CAST(@NumberOfLetters AS varchar) + ‘) AS ShortName FROM Production.Product’;
EXEC(@str);
Run Code Online (Sandbox Code Playgroud)
这次它起作用了,因为如上所述,该CAST()功能需要EXEC在行之前完全解析。
但我还有一个问题,LEFT()函数呢,为什么可以运行EXEC?
我想创建一个扩展事件会话,并使用like_i_sql_unicode_string运算符过滤短语[demo],并使用方括号。我从以下开始:
CREATE EVENT SESSION [demo] ON SERVER
ADD EVENT sqlserver.sql_batch_completed(
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%[demo]%'))
)
ADD TARGET package0.ring_buffer
alter event session [demo] on server state=start
Run Code Online (Sandbox Code Playgroud)
但这会解释[demo]为类似正则表达式的语法上的字符组。所以如果我运行这个:
-- m
Run Code Online (Sandbox Code Playgroud)
它将在扩展事件中捕获。
我得到的最接近的是稍后过滤它,使用[sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%demo%')过滤器然后:
SELECT
n.ev.value('@timestamp','datetimeoffset') as [timestamp],
n.ev.value('data[@name="batch_text"][1]','varchar(max)') as [batch_text]
FROM sys.dm_xe_session_targets xet
INNER JOIN sys.dm_xe_sessions xe ON xe.[address] = xet.event_session_address
cross apply (select CONVERT(XML, target_data) as xData ) as x
cross apply x.xData.nodes(N'RingBufferTarget/event') AS n(ev)
WHERE xe.name = N'demo' AND xet.target_name = N'ring_buffer'
and n.ev.value('data[@name="batch_text"][1]','varchar(max)') like …Run Code Online (Sandbox Code Playgroud) 我在这里查看 SQL 关键字列表https://www.postgresql.org/docs/current/sql-keywords-appendix.html
那里有一些单字母关键字。我找不到有关他们的任何信息。我在哪里可以找到这些信息以及这些信息的用途是什么?
例子,
A,C,F,G,K,M,P,T。
syntax ×10
sql-server ×4
postgresql ×3
sql-standard ×2
aggregate ×1
datatypes ×1
distinct ×1
foreign-key ×1
functions ×1
group-by ×1
like ×1
mysql ×1
mysql-5.7 ×1
operator ×1
pivot ×1
plpgsql ×1
query ×1
regclass ×1