拉佳 發表於 2023-6-13 00:00:00

怎样写出可以在各个数据库中都能执行的SQL?

<p>
        不同类型数据库的函数语法或多或少存在差异,要想让功能相同的 SQL 查询语句在不同类型的数据库中都能被顺利执行,就要把各数据库都有的那些差异化函数语法进行翻译。
</p>
<p>
        <img title="怎样写出可以在各个数据库中都能执行的SQL?" alt="怎样写出可以在各个数据库中都能执行的SQL?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/60dcf0ca9e03ef2b8a8159f3e054d664.jpg"></p>
<p>
        使用 ORM 技术能够将程序员书写的查询转换成不同数据库的 SQL,相当于有一定的移植能力。但 ORM 技术只适合应对 OLTP 场景下的简单 SQL,难以实现 OLAP 场景下较复杂 SQL 的移植,例如,使用了 ORM 技术中不直接支持的函数,或者遇到 FROM 中包含子查询的复杂 SQL。
</p>
<p>
        集算器 SPL 设计了一套标准的 SQL 查询语法,该语法内置大量函数(还在持续追加中),可描述更多常运算。SPL 中有一个 sqltranslate 函数,可以把这种标准 SQL 翻译成不同数据库的 SQL,实现数据库的迁移。
</p>
<p>
        比如这样的标准 SQL:
</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">SELECT</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE), </span><span class="func">SUM</span><span>(AMOUNT) </span></span>
        </li>
        <li>
                <span>, <span class="func">COUNT</span><span>(ORDERID) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">FROM</span><span> ORDERS </span></span>
        </li>
        <li>
                <span><span class="keyword">GROUP</span><span> </span><span class="keyword">BY</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">HAVING</span><span> </span><span class="func">SUM</span><span>(AMOUNT) &gt; 2000 </span></span>
        </li>
</ol>
<p>
        用.sqltranlate(“MYSQL”) 翻译后就得到:
</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">SELECT</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE), </span><span class="func">SUM</span><span>(AMOUNT) </span></span>
        </li>
        <li>
                <span>, <span class="func">COUNT</span><span>(ORDERID) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">FROM</span><span> ORDERS </span></span>
        </li>
        <li>
                <span><span class="keyword">GROUP</span><span> </span><span class="keyword">BY</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">HAVING</span><span> </span><span class="func">SUM</span><span>(AMOUNT) &gt; 2000 </span></span>
        </li>
</ol>
<p>
        而如果使用.sqltranslate(“ORACLE”) 将返回:
</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">SELECT</span><span> CLIENT, EXTRACT(</span><span class="func">YEAR</span><span> </span><span class="keyword">FROM</span><span> ORDERDATE), </span><span class="func">SUM</span><span>(AMOUNT) </span></span>
        </li>
        <li>
                <span>, <span class="func">COUNT</span><span>(ORDERID) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">FROM</span><span> ORDERS </span></span>
        </li>
        <li>
                <span><span class="keyword">GROUP</span><span> </span><span class="keyword">BY</span><span> CLIENT, EXTRACT(</span><span class="func">YEAR</span><span> </span><span class="keyword">FROM</span><span> ORDERDATE) </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">HAVING</span><span> </span><span class="func">SUM</span><span>(AMOUNT) &gt; 2000 </span></span>
        </li>
</ol>
<p>
        可以看到,标准函数能够正确地根据数据库选择相应的函数。
</p>
<p>
        SPL 实现 SQL 移植,采取的策略是只对标准 SQL 中的函数进行翻译,不翻译(原样照抄)语句,从而使标准 SQL 可描述更多的运算。比如,对于下面的子查询无论翻译成哪种数据库 SQL 都不会变,也都可以正常执行。
</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">SELECT</span><span> </span></span>
        </li>
        <li>
                <span>ORDERID, </span>
        </li>
        <li class="alt">
                <span>M </span>
        </li>
        <li>
                <span><span class="keyword">FROM</span><span> </span></span>
        </li>
        <li class="alt">
                <span>( </span>
        </li>
        <li>
                <span><span class="keyword">SELECT</span><span> </span></span>
        </li>
        <li class="alt">
                <span>ORDERID, </span>
        </li>
        <li>
                <span><span class="func">MONTH</span><span>(ORDERDATE) M </span></span>
        </li>
        <li class="alt">
                <span><span class="keyword">FROM</span><span> </span></span>
        </li>
        <li>
                <span>ORDERS) T1 </span>
        </li>
</ol>
<p>
        集算器 SPL 是 Java 写的开源软件,很容易被 JAVA 应用 集成而使用这个 SQL 移植的功能,在应用程序中如果需要翻译 SQL 语句,可以直接调用 api 方法:
</p>
<ol class="dp-sql">
<li class="alt">
                <span><span>String sql = “</span><span class="keyword">SELECT</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE), </span><span class="func">SUM</span><span>(AMOUNT) , </span><span class="func">COUNT</span><span>(ORDERID) </span><span class="keyword">FROM</span><span> ORDERS </span><span class="keyword">GROUP</span><span> </span><span class="keyword">BY</span><span> CLIENT, </span><span class="func">YEAR</span><span>(ORDERDATE) </span><span class="keyword">HAVING</span><span> </span><span class="func">SUM</span><span>(AMOUNT) &gt; 2000”; </span></span>
        </li>
        <li>
                <span>sql = com.raqsoft.dm.sql.SQLUtil.translate(sql, “ORACLE”); </span>
        </li>
</ol>
<p>
        原文链接:https://www.toutiao.com/a7043608392438448671/
</p>
頁: [1]
查看完整版本: 怎样写出可以在各个数据库中都能执行的SQL?