SQL |选择(...)其中2列组合相等(xy)

时间:2016-04-20 13:41:01

标签: sql .net oracle

我不知道如何以有效的方式解决以下问题。

鉴于

1。 电话号码作为一个单一字符串,例如:1111223344

2。 具有此编号split in 2 different Columns的数据库 (ColA中的数字的第一部分,ColB中的数字的第二部分)  |数据库非常庞大(高达100 GB)

让我们说ColA是'11112' 在ColB中是'23344' - 这两个列的组合是我们正在寻找的字符串。我们不知道哪一列中有多少个字符。

需要:一个select语句,combines ColA + ColB and compares it to the given String。如果等于:选择行。

将选择所选的行/行并与.Net应用程序一起使用。

4 个答案:

答案 0 :(得分:2)

这应该让你开始。您需要根据实际要求进行调整。

如果保证两个值是字符串:

SELECT *
FROM MyTable m
WHERE m.ColA + m.ColB = '1111223344'

如果这两个值不能保证为字符串:

SELECT *
FROM MyTable m
WHERE CONCAT(m.ColA, m.ColB) = '1111223344'

答案 1 :(得分:2)

我能想到的一种方法是,将Hashbytes用作计算列。您可以为此列编制索引,以获得良好的性能。

CREATE TABLE #TESTMAIN
(
NMBR VARCHAR(10)
)
INSERT INTO #TESTMAIN
SELECT '123456'
UNION ALL
SELECT '3456'

create table #backup
(
nmbr1 varchar(10),
nmbr2 varchar(10)
)

insert into #backup
select '123','456'
union all
select '34','56'

Alter table #testmain
add mainnmbr as hashbytes('SHA1',nmbr)

select * from #testmain

Alter table #backup
add bckpnmbr as hashbytes('SHA1',concat(nmbr1,nmbr2))

select * from #testmain
select * from #backup

现在您可以对以下数据进行简单的比较..
enter image description here

答案 2 :(得分:1)

如果您的要求只是找到连接为xy的行集,那么您可以尝试这样做:

DECLARE @x VARCHAR(50), @y VARCHAR(50)

SELECT ColA, ColB
FROM Source WITH NOLOCK --If you like, depending on your environment
WHERE ColA = @x AND ColB = @y

NOLOCK业务取决于其他人可能与您的查询同时写入您的数据库。如果您拥有自己的数据库,或者它是否严格用于读取操作,那就太棒了。如果您有任务关键性写入,可能会在白天或晚上的任何时间发生。当然你需要适当调整@x和@y的大小。如果你有一个7位数的区号,没有装饰@x可能是VARCHAR(3)而@y可能是VARCHAR(7)

答案 3 :(得分:1)

如果您有更多读取而不是写入,则可以通过使用基于功能的索引(more info)和DunningKrugerEffect建议的查询来提高性能。如果不创建该索引,您将具有表全扫描,这对大表不利。

SELECT *
FROM MyTable m 
WHERE CONCAT(m.ColA, m.ColB) = '1111223344'