标签: syntax

检测是否在数值中设置了位

我有一个表示一组标志的 tinyint 列。假设我想知道是否设置了特定位,我如何在存储过程中执行按位 AND/OR 操作?

sql-server stored-procedures syntax

6
推荐指数
1
解决办法
5360
查看次数

为什么根据 SQL-92,未加引号的标识符是大写的?

SQL-92 标准的第 5.6 节包含规则 10...13,其中未加引号的标识符应大写,因此foo变为FOO"foo"仍然是foo

例如,Oracle、IBM DB2、SnowflakeksqlDB遵守这些规则,但Postgres 、MySQL 或 SQLite 则不遵守这些规则。

问题是,为什么?根据我的理解,在具有大量关键字的语言中可选地引用标识符是有意义的。标识符一致的区分大小写或不区分大小写也是有意义的。但让它依赖于被引用的标识符看起来并不合理。

我缺少什么?

syntax sql-standard case-sensitive quoted-identifier

6
推荐指数
2
解决办法
881
查看次数

SQL Server 2005:如何使用数据透视代替一堆 case 语句?

请告诉我如何修改此 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)

sql-server-2005 syntax pivot

5
推荐指数
2
解决办法
1630
查看次数

是否可以在同一个 SELECT 子句的 SELECT 子句中引用聚合函数的结果?

我不是数据库管理员——只是一个软件工程师。我想知道是否可以减少以下 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 查询比这更大更复杂。

sql-server-2008 sql-server query syntax aggregate

5
推荐指数
1
解决办法
4520
查看次数

有没有办法避免重复外键的定义?

我想知道这个例子

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)以创建天气表?

postgresql foreign-key syntax

5
推荐指数
1
解决办法
692
查看次数

PL/pgSQL regclass 引用名为 like 关键字的表

我想通过在现有表名的基础上附加后缀来创建一个新表名。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)

进一步假设有两个表:treenodeoverlay。为这两个函数调用此函数会产生以下新名称:

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 …

postgresql syntax datatypes plpgsql regclass

5
推荐指数
1
解决办法
2087
查看次数

在 MySQL 5.7.13 和 5.7.11 中容忍 SQL 错误(orderby not in distinct,select not in group by)

此问题与以下 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 …

mysql syntax group-by distinct mysql-5.7

5
推荐指数
1
解决办法
1243
查看次数

无法针对 EXEC 运行函数

我的 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

sql-server syntax functions

5
推荐指数
1
解决办法
282
查看次数

在扩展事件过滤器上使用方括号

我想创建一个扩展事件会话,并使用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-server syntax extended-events operator like

5
推荐指数
1
解决办法
556
查看次数

这些单字母 SQL 关键字是什么?

我在这里查看 SQL 关键字列表https://www.postgresql.org/docs/current/sql-keywords-appendix.html

那里有一些单字母关键字。我找不到有关他们的任何信息。我在哪里可以找到这些信息以及这些信息的用途是什么?

例子, ACFGKMPT

postgresql syntax sql-standard

5
推荐指数
1
解决办法
118
查看次数