这是有效的ANSI SQL吗?:
SELECT 1 AS X
,2 * X AS Y
,3 * Y AS Z
Run Code Online (Sandbox Code Playgroud)
因为Teradata(12)可以做到这一点,以及这个(是的,疯了不是它):
SELECT 3 * Y AS Z
,2 * X AS Y
,1 AS X
Run Code Online (Sandbox Code Playgroud)
但是SQL Server 2005需要这样的东西:
SELECT X
,Y
,3 * Y AS Z
FROM (
SELECT X
,2 * X AS Y
FROM (
SELECT 1 AS X
) AS X
) AS Y
Run Code Online (Sandbox Code Playgroud) 我有一个teradata表,其中有大约1000万条记录,它将数字id字段存储为varchar.我需要将此字段中的值传输到另一个表中的bigint列,但我不能简单地说cast(id_field为bigint)因为我得到了无效的字符错误.通过查看值,我发现字符串中的任何位置都可能有一个字符,所以让我们说字符串是varchar(18)我可以过滤掉无效的行,如下所示:
where substr(id_field,1,1) not in (/*big,ugly array of non-numeric chars*/)
and substr(id_field,2,1) not in (/*big,ugly array of non-numeric chars*/)
etc, etc...
Run Code Online (Sandbox Code Playgroud)
演员会工作,但从长远来看这是不可行的.它很慢,如果字符串有18个可能的字符,它会使查询不可读.如何在不使用非数字字符数组单独检查每个字符的情况下过滤掉在此字段中具有值而不会作为bigint转换的行?
示例值将是
123abc464
a2.3v65
a_356087
........
000000000
BOB KNIGHT
1235468099
Run Code Online (Sandbox Code Playgroud)
值不遵循特定的模式,我只需要过滤掉包含任何非数字数据的值.123456789没问题,但123.abc_c3865不是......
我在互联网上找到的一些文章比较了ISNULL和COALESCE,所以我认为我的问题有点不同.
我想知道哪个性能更好?
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
Run Code Online (Sandbox Code Playgroud)
要么
SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';
Run Code Online (Sandbox Code Playgroud)
除了表现,在决定时我还应该考虑其他问题吗?
编辑:
我正在使用Teradata.
有人有这个成功吗?网上没有大量的参考资料,我已经用尽了谷歌上的所有相关结果.这是我的脚本:
#!/usr/bin/perl
use DBI;
use DBD::ODBC;
$user = "user";
$pw = "pw";
$ip = "192.168.1.0"
#DBI->trace(DBD::ODBC->parse_trace_flags('odbconnection'));
#my $connect_attrs = { PrintError => 0, RaiseError => 1, AutoCommit => 1 };
my $dbh = DBI->connect("dbi:ODBC:$ip", $user, $pw);
Run Code Online (Sandbox Code Playgroud)
错误消息:
DBI connect('192.168.1.0','user',...) failed: (no error string) at ./teradata.pl line 13
Run Code Online (Sandbox Code Playgroud)
注释掉的两行是我之前无法尝试连接数据库的遗留问题.
更新:以前是我使用DBD模块所做的努力.
#!/usr/bin/perl
use DBI;
$user = "xxxx";
$pw = "xxxx";
my $dbh = DBI->connect("dbi:Teradata:tdsn", $user, $pw);
Run Code Online (Sandbox Code Playgroud)
错误:
DBI connect('tdsn','xxxx',...) failed: Unable to get host address. at ./teradata.pl line 12
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
#!/usr/bin/perl …Run Code Online (Sandbox Code Playgroud) 我一直在工作,看不到Oracle前导和滞后功能的等效功能.
oracle领导看起来像
LEAD(col1.date,1,ADD_MONTHS(col1.DATE,12))
OVER(Partition By tab.a,tab.b,tab.c Order By tab.a)-1 END_DATE
LAG(col1.DATE + 7,1,col1.DATE-1)
OVER(partition by tab.a,tab.b Order By tab.b) LAG_DATE
Run Code Online (Sandbox Code Playgroud)
任何更好的主意
我想让它在Teradata中工作:
更新SQL以获得更好的示例
select
case
when
current_date between
cast('03-10-2013' as date format 'mm-dd-yyyy') and
cast('11-03-2013' as date format 'mm-dd-yyyy')
then 4
else 5
end Offset,
(current_timestamp + interval Offset hour) GMT
Run Code Online (Sandbox Code Playgroud)
但是,我得到了一个错误Expected something like a string or a Unicode character blah blah.看来你必须像这样硬编码间隔:
select current_timestamp + interval '4' day
Run Code Online (Sandbox Code Playgroud)
是的,我知道我在第一个例子中对其进行了硬编码,但这只是为了证明计算结果.
如果您必须知道,我必须将几张桌子中的所有日期和时间转换为GMT,但我必须考虑夏令时.我在东部,所以如果日期在DST时间范围内,我需要增加4小时,否则增加5小时.
我知道我可以为每个句点创建单独的更新语句,并相应地将值从4更改为5,但我希望我的查询是动态和智能的.
如何从teradata timestamp(6)字段中搜索特定日期:'2013-10-22'?
sel * from table A
where date = '2013-10-22';
Run Code Online (Sandbox Code Playgroud)
我尝试了上面的抛出错误的查询.请帮忙!
我正在创建一个volatile表并尝试向表中插入行.我可以上传一行如下...
create volatile table Example
(
ProductID VARCHAR(15),
Price DECIMAL (15,2)
)
on commit preserve rows;
et;
INSERT INTO Example
Values
('Steve',4);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试上传多个时,我收到错误:
"语法错误:预期在')'和','之间."
INSERT INTO Example
Values
('Steve',4),
('James',8);
Run Code Online (Sandbox Code Playgroud) 我有像这些'有'的弧/边:
Node1 Node2
A B
B C
D E
Run Code Online (Sandbox Code Playgroud)
这里A连接到B和B连接到C.D连接到E.换句话说,这些'想要'中显示了2个组/簇:
Node1 Node2 Cluster
A B 1
B C 1
D E 2
Run Code Online (Sandbox Code Playgroud)
我可以使用SQL来识别这些组/集群吗?我想这涉及自联接,但我看不出如何编写这个SQL.任何反馈都将非常感激.谢谢!