第五十一章 SQL命令 HAVING(二)

第五十一章 SQL命令 HAVING(二)

In和%INLIST谓词

IN谓词用于将值与一系列非结构化的项进行匹配。

%INLIST谓词是 IRIS扩展,用于将值与列表结构的元素进行匹配。

使用任一谓词,都可以执行相等比较和子查询比较。

在中有两种格式。第一个用作使用与OR运算符链接在一起的多个相等比较的速记。例如:

SELECT Name, Home_State FROM Sample.Person
GROUP BY Home_State
HAVING Home_State IN ('ME','NH','VT','MA','RI','CT')
image.png

如果Home_State等于括号列表中的任意值,则计算为TRUE。列表元素可以是常量或表达式。排序规则适用于IN比较,因为它适用于相等性测试。默认情况下,IN比较使用字段定义的排序规则类型;默认情况下,字符串字段定义为SQLUPPER,不区分大小写。

当日期或时间用于IN谓词相等比较时,会自动执行适当的数据类型转换。如果HAVING子句字段是TIMESTAMP类型,则DATETIME类型的值将转换为TIMESTAMP。如果HAVING子句字段为DATE类型,则TIMESTAMPSTRING类型的值将转换为DATE。如果HAVING子句字段为TIME类型,则TIMESTAMPSTRING类型的值将转换为TIME

下面的示例都执行相同的相等比较并返回相同的数据。
groupby字段指定对于每个成功的相等比较只返回一条记录。
DOB字段的数据类型为Date:

SELECT Name,DOB FROM Sample.Person 
GROUP BY DOB
HAVING DOB IN ({d '2014-01-02'},{d '1990-04-25'})
image.png
SELECT Name,DOB FROM Sample.Person
GROUP BY DOB
HAVING DOB IN ({ts '2014-01-02 00:00:00'},{ts '1990-04-25 00:00:00'})
image.png

%INLIST谓词可用于对列表结构的元素执行相等比较。
%INLIST使用EXACT排序。
因此,默认情况下,%INLIST字符串比较是区分大小写的。

下面的例子使用%INLIST来匹配一个字符串值到FavoriteColors列表字段的元素:

SELECT Name,FavoriteColors FROM Sample.Person 
HAVING 'Red' %INLIST FavoriteColors
image.png

它返回FavoriteColors中包含元素“Red”的所有记录。

下面的嵌入式SQL示例将Home_State列值与northne(新英格兰北部各州)列表中的元素匹配:

ClassMethod Having()
{
    s northne = $lb("VT","NH","ME")
    &sql(
        DECLARE StateCursor CURSOR FOR 
        SELECT Name,Home_State
        INTO :name,:state FROM Sample.Person
        HAVING Home_State %INLIST :northne
    )
    &sql(OPEN StateCursor)
    q:(SQLCODE'=0)
    n %ROWCOUNT,%ROWID
    for { 
        &sql(FETCH StateCursor)
        q:SQLCODE  
        w !,"#",%ROWCOUNT," Name=",name," State=",state,!
    }
    w !,"Final Fetch SQLCODE: ",SQLCODE
    &sql(CLOSE StateCursor)
}

DHC-APP>d ##class(PHA.TEST.SQLCommand).Having()
 
#1 Name=Lepon,Jeff Z. State=NH
 
#2 Name=Ingleman,Terry A. State=NH
 
#3 Name=Jung,Keith W. State=NH
 
#4 Name=Xiang,Kirsten U. State=ME
 
#5 Name=Jackson,Ralph V. State=VT
 
#6 Name=Tesla,Geoffrey O. State=NH

还可以在子查询中使用IN%INLIST来测试列值(或任何其他表达式)是否等于任何子查询行值。
例如:

SELECT Name,Home_State FROM Sample.Person
HAVING Name IN 
 (SELECT Name FROM Sample.Employee
 HAVING Salary < 50000)
image.png

注意,子查询在SELECT列表中必须只有一个项。

%STARTSWITH谓词

IRIS %STARTSWITH比较操作符允许对字符串或数字的初始字符执行部分匹配。
下面的示例使用%STARTSWITH
它根据年龄进行选择,然后为每个以“S”开头的Name返回一条记录:

SELECT Name,Age FROM Sample.Person
WHERE Age > 30
HAVING Name %STARTSWITH 'S'
ORDER BY Name
image.png

与其他字符串字段比较一样,%STARTSWITH比较不区分大小写。

Contains Operator ([)

Contains操作符是左括号符号:[
它允许将子字符串(字符串或数字)匹配到字段值的任何部分。
比较总是区分大小写的。
下面的例子在HAVING子句中使用Contains操作符选择那些Home_State值包含“K”的记录,然后对这些状态执行%AFTERHAVING计数:

SELECT Home_State,COUNT(Home_State) AS States,
   COUNT(Home_State %AFTERHAVING) AS KStates
 FROM Sample.Person
 HAVING Home_State [ 'K'
image.png

FOR SOME谓词

HAVING子句的FOR SOME谓词决定是否根据一个或多个字段值的条件测试返回结果集。
该谓词的语法如下:

FOR SOME (table[AS t-alias]) (fieldcondition)

FOR SOME指定字段condition的值必须为true;
至少有一个字段值必须匹配指定的条件。
Table可以是单个表,也可以是逗号分隔的表列表,也可以是表别名。
Fieldcondition为指定表中的一个或多个字段指定一个或多个条件。
table参数和字段condition参数都必须用括号分隔。

下面的例子展示了FOR SOME谓词的用法:

SELECT Name,Age
FROM Sample.Person
HAVING FOR SOME (Sample.Person)(Age>20)
ORDER BY Age
image.png

在上面的示例中,如果至少有一个字段包含大于20Age值,则返回所有记录。
否则,不返回任何记录。

NULL 谓词

这将检测未定义的值。
你可以检测所有空值,或所有非空值:

SELECT Name, FavoriteColors FROM Sample.Person
HAVING FavoriteColors IS NULL 
image.png
SELECT Name, FavoriteColors FROM Sample.Person
HAVING FavoriteColors IS NOT NULL 
ORDER BY FavoriteColors
image.png

使用GROUP BY子句,可以为指定字段的每个非空值返回一条记录:

SELECT Name, FavoriteColors FROM Sample.Person
GROUP BY FavoriteColors
HAVING FavoriteColors IS NOT NULL 
ORDER BY FavoriteColors
image.png

EXISTS 谓词

它使用子查询来测试子查询是否计算为空集。

SELECT t1.disease FROM illness_tab t1 WHERE EXISTS 
 (SELECT t2.disease FROM disease_registry t2 
 WHERE t1.disease = t2.disease 
 HAVING COUNT(t2.disease) > 100) 

LIKE、%MATCHES和%PATTERN谓词

这三个谓词允许执行模式匹配。

  • LIKE允许使用文字和通配符进行模式匹配。
    当希望返回包含已知字面值子字符串的数据值,或在已知序列中包含多个已知子字符串时,请使用LIKE
    LIKE使用目标的排序规则进行字母大小写比较。
  • %MATCHES允许使用文字、通配符、列表和范围进行模式匹配。
    当希望返回包含已知字面值子字符串的数据值,或包含一个或多个位于可能字符列表或范围内的字面值字符,或在已知序列中包含多个这样的子字符串时,请使用%MATCHES
    %MATCHES使用EXACT排序法进行字母大小写比较。
  • 允许指定字符类型的模式。
    例如,'1U4L1",".A'(1个大写字母,4个小写字母,一个逗号,后面跟着任意数量的字母字符)。
    如果希望返回包含已知字符类型序列的数据值,请使用%PATTERN
    当数据值不重要,但这些值的字符类型格式很重要时,%PATTERN特别有用。
    PATTERN还可以指定已知的文字字符。
    它使用EXACT排序法进行文字比较,这总是区分大小写的。

要与字符串的第一个字符进行比较,请使用%STARTSWITH谓词。

示例

下面的示例为每个至少有一个21岁以下的人的州返回一行。
对于每一行,它返回该州所有人的平均、最小和最大年龄。

 SELECT Home_State, MIN(Age) AS Youngest,
  AVG(Age) AS AvgAge, MAX(Age) AS Oldest
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age < 21
 ORDER BY Youngest
image.png

下面的示例为每个至少有一个21岁以下的人的州返回一行。
对于每一行,它返回该州所有人的平均、最小和最大年龄。
使用%AFTERHAVING关键字,它还返回该州21岁以下的人的平均年龄(AvgYouth),以及该州21岁以下最年长的人的年龄(OldestYouth)。

SELECT Home_State,AVG(Age) AS AvgAge,
   AVG(Age %AFTERHAVING) AS AvgYouth,
   MIN(Age) AS Youngest, MAX(Age) AS Oldest,
   MAX(Age %AFTERHAVING) AS OldestYouth
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age < 21
 ORDER BY AvgAge
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容