我需要检查where子句在整数范围内的表达式结果.
点赞这个:
select * from table where (col1 / col2 ) in (1..8).
Run Code Online (Sandbox Code Playgroud)
随着(1..8)表示整数范围.
我的意思是它必须是整数,而不是浮点数.所以我不能使用between 1 and 8,因为1.2将是正确的.
我在Oracle 2000+系列中有很多非常长的触发器,有很多调用.我想生成程序流程图(算法),以便更好地理解进一步重构的过程.
这不是我写的代码,所以我不太了解逻辑.
在这种情况下你会建议做什么?我试图绘制一个类似文本的流程但是它需要花费很多时间而且仍然难以涵盖所有理解的逻辑.
我看到的最好的方法是从SQL proc生成的流程图,其中包含代码和图表之间"跳转"的链接.
更新:找到几个相同的软件:
ClearSQL - 生成CRUD图,调用图和流程图.
Quest SQL Navigator Expert(现在使用它):它有Outline(使代码流能够折叠 - 扩展代码块 - 真的很酷!),Code Explorer(枚举所有func,params with links ti SQL text - just in interface ) 特征
在比较可能包含不同情况的值的列时,使用什么更好?校对速度更快吗?只是想弄清楚这一点,因为在我们的项目中有大量数据比较。我们用:
select * from table t1, table t2 where
t1.col1 collate SQL_Latin1_General_CP1_CI_AS = t2.colb collate SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)
为什么我们不能重写为:
select * from table t1, table t2 where
UPPER(t1.col1) = UPPER(t2.colb)
Run Code Online (Sandbox Code Playgroud) 我想澄清一下如何将.csv中的数据导入到包含3列的表中(参见下面的CR Ranking.csv).我的查询:
select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\Work\;HDR=Yes;',
'SELECT * FROM [CR Ranking.csv]');
Run Code Online (Sandbox Code Playgroud)
输出结果为一个库存:
header: Category;INfo;Rank
row 1: Category 1;Info;1
row 2: Category 2;INfo2;2
row 3: Category 3;INfo3;3
Run Code Online (Sandbox Code Playgroud)
是否可以通过Openrowset将.csv中的数据拆分为3列?我想我错过了Openrowset params的东西,也许这很容易?
是的:我正在使用Office 2010的64位ODBC驱动程序来获取.csv,.txt等的驱动程序......这就是为什么提供程序是:'Microsoft.ACE.OLEDB.12.0',这就是为什么这个连接字符串没有'似乎工作:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\';Extended Properties="text; HDR=NO; FMT=Delimited";
Run Code Online (Sandbox Code Playgroud)
CR Ranking.csv:
Category;INfo;Rank
Category 1;Info;1
Category 2;INfo2;2
Category 3;Info3;3
Run Code Online (Sandbox Code Playgroud)
UPD 1: 是否有可能做不格式的文件?
UPD 2:我通过格式文件制作 - 很简单.抱歉打扰了.
我们在SQL Server 2008(SP1) - 10.0.2531.0(X64) - Win2008 SP2(X64)上遇到了一个奇怪的情况.
这是一个重问题:
select t1.id, t2.id
from t1, t2
where
t1.id = t2.ext_id
and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
.... and about 10 more comparisons with Isnull
Run Code Online (Sandbox Code Playgroud)
UPD:比较的所有列(ID除外)是varchar(~30 ... 200)
T1是~130mln行,T2是~300k行.
这些查询相当大的Dev服务器运行~5小时 - 这很慢,但我们能做什么?
虽然我们调查了可能的优化方法 - 我们发现,在上面的查询中将"isnull"更改为"coalesce"可以获得双倍的性能提升 - 并且查询现在可以运行~2小时
UPD:当我们删除所有ISNULL检查并使用时t1.vchCol1 = t2.vchCol1,查询在40分钟后完成.
问题是:这是已知行为,我们应该避免在任何地方使用IsNull吗?
我在/etc/init.d dir上有一个关闭Oracle的关闭脚本,它执行"stop"命令:
su oracle -c "lsnrctl stop >/dev/null"
su oracle -c "sqlplus sys/passwd as sysdba @/usr/local/PLATEX/scripts/orastop.sql >/dev/null"
Run Code Online (Sandbox Code Playgroud)
..问题是当lsnrctl或sqlplus没有响应时 - 在这种情况下,这个"停止"脚本永远不会结束,服务器无法关闭.唯一的方法 - 就是"杀 - 9"那个.
我想重写脚本,以便在5分钟后(例如)如果命令没有完成 - 它应该被终止.
我怎么能做到这一点?你能举个例子吗?我在Linux RHEL 5.1 + bash下.
sql ×2
64-bit ×1
bash ×1
csv ×1
diagram ×1
isnull ×1
openrowset ×1
oracle ×1
performance ×1
sql-server ×1
t-sql ×1