我不知道如何以有效的方式解决以下问题。
鉴于:
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应用程序一起使用。
答案 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
答案 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'