DBMNG数据库管理与应用

抓住自己最有兴趣的东西,由浅入深,循序渐进地学……
当前位置:首页 > 数据库基础 > SQL语言

SQL行值表达式(Row Value Expressions)

  • 概述

    最近接触了一个新概念——行值表达式,也叫做行值构造器。这是一个很强大的SQL功能,通常我们所操作的SQL表达式都只能针对一行中的单一字段进行操作比较,而行值表达式可以针对一行中的多个字段进行操作比较。

    它在SQL:92的标准里就被定义过,但到目前为止,也并不是所有数据库都支持,并且每个数据库支持程度不一致。

    这列出了几个支持行值表达式的数据库:

    DB2 HSQLDB MySQL Oracle Postgres

    查询语句示例


    1.SELECT * FROM t
    2.WHERE (t.t1, t.t2) IN (
    3.SELECT u.u1, u.u2 FROM u       
    4.)

    上面这个示例能够选出t表和u表中,字段相同的值。只用了一个表达式,就比较了两个字段。换成传统的写法就是:


    1.SELECT * FROM t
    2.WHERE EXISTS(
    3.SELECT * FROM u
    4.WHERE t.t1 = u.u1 AND t.t2 = u.u2  
    5.)

    传统的写法也能实现同样的功能,但代码量就多了,传统的写法用了两个表达式,比较两个字段,并用AND连接。

    更新语句示例(Mysql5.5 不支持)


    1.UPDATE t
    2.SET (t.t1, t.t2) =
    3.('A', 'B')
    4.WHERE ID = 10

    上述示例是表t中,将字段ID=10的行中的t1修改成‘A’,t2修改成‘B’。传统的写法是:


    1.UPDATE t
    2.SET t.t1 = 'A', t.t2 = 'B'
    3.WHERE ID = 10

    行值表达式的比较

    除了查询语句示例的IN用法外,行值表达式还可以使用=,!=,>,<,>=,<=等符号进行字段比较。

    以下为TRUE:


    1.(9, 9, 9) > (1, 1, 1)
    2.('Bob', 'Bar') > ('Alan', 'Alert')
    3.(3, 2, 1) != (4, 3, 2)

    上述比较简单,一眼能看出真假,因为一一对应的元素比较都为真~

    但其实比较行值表达式时,不必每个元素都为TRUE,越左边的元素越重要,只要靠左边的元素为TRUE,则整个表达式就为TRUE

    以下也为TRUE:


    1.(9, 1, 1) > (1, 9, 9)
    2.('Zommer', 'Andy') > ('Alpert' , 'Zelda')

    若第一位相同,比较第二位,以此类推,以下也为TRUE:


    1.(1, 1, 2) > (1, 1, 1)
    2.(1, 2, 1) > (1, 1, 1)
    3.(1, 2, 1) > (1, 1, 2)

    对于等表达式,必须所有元素都为TRUE,表达式才是TRUE:


    1.(1, 2, 3) = (1, 2, 3)

    对于不等表达式,只需要一个元素为TRUE,表达式就为TRUE:


    1.(1, 2, 1) != (1, 1, 1)

    下面用一个通用的行值表达式进行传统的转换,能更清晰的说明,行值表达式的比较是怎么运作的:


    01.行值表达式:
    02.(A, B, C) > (X, Y, Z)
    03.对应的传统变换:
    04.(A > X)
    05.OR ((A = X) AND (B > Y))
    06.OR ((A = X) AND (B = Y) AND (C > Z))
    07. 
    08.行值表达式:
    09.(A, B, C) >= (X, Y, Z)
    10.对应的传统变换:
    11.(A > X)
    12.OR ((A = X) AND (B > Y))
    13.OR ((A = X) AND (B = Y) AND (C > Z))
    14.OR ((A = X) AND (B = Y) AND (C = Z))

    由上可见,行值表达式在某些情况下相对于传统表达式有多方便。

     

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号