Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Побитовое сравнение двух строк  [new]
NvAriec
Member

Откуда:
Сообщений: 5
Добырй день.
Есть две строки:
+

000000000111111111111100000111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111011111111111110011111111111111111111111111111101111110111111111111111111111111111111111111111111111111110111011111111111111111111111111111111111111111111111011111110111111111111111111001111011111111111101111111111111111111100000111111111111111111110111111111111111111011111111111111100001111111111111111111001111111011111111100011100111111111111111111111111010111111111111110000110001111000110001000001111001011100000111111100000000000000000000000000011111100000011000000001111100100001000001101111100000000001000111000000111111111111011111111111111111111111111111111000000000000000000000010111111101111111101110001111111111111111111111111000011111111110111110001111100000001111101011111111000111111111111110000000000000000001111111001111111100000000111111000000111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000110000011110011111000000100111

000011110000111000000001110000000000011110000000000001000000000000000000000000000000000011000000011000000000000000000100001100000000000100110100000001111100000110100000000001100000000000000001000000000010110000000011000100000000001000000110000000011110001010000000000000000000000000000110000100000010000000000100000011111111111100000000001111010000000000000000011111100101000010001000001000000000001100000010000000011111111001000000000000100001111000000100000011111101110111100000000000010000000110000000000001111111111111110111111111111100111100111011100001100001111011111000100000000111101111001111001101001010011100011000111100000000011100111111110011111110100000000000000110000000000000000000000001100111111111111111111111111100000011110000011111111000000000000000000001111111111111001110100001110000011111111111011111111011111000000001001111111100111001111110000011110000000111111100001011111100000011000001000000000110000000000001100000000001010000000100000000000000000001001111111111111111111111100000111110111100


Необходимо сделать побитовое И и побитовое ИЛИ и получить строку в таком же виде.

| и & не срабатывают, им нужен целочисленный тип или varbinary (но только для одного из выражений).

Как корректно сделать такую вещь?

Может как-то можно посимвольно проходить и сравнивать и делать третий элемент и его выводить?

Сообщение было отредактировано: 6 июн 17, 17:53
6 июн 17, 17:51    [20544402]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Rankatan
Member

Откуда:
Сообщений: 250
рекурсивный cte
6 июн 17, 18:01    [20544435]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
Rankatan
рекурсивный cte

Зачем?

select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) ) =  from dbo.Numbers where n betweeen 1 and len(@str1)
6 июн 17, 18:53    [20544569]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
NvAriec
Member

Откуда:
Сообщений: 5
aleks2
Rankatan
рекурсивный cte

Зачем?

select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) ) =  from dbo.Numbers where n betweeen 1 and len(@str1)


Наверное вот так:
select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) )[b])[/b] from dbo.Numbers where n betweeen 1 and len(@str1)
Но ругается тогда на это:
An expression of non-boolean type specified in a context where a condition is expected, near 'betweeen'.
6 июн 17, 23:57    [20545193]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
NvAriec
Member

Откуда:
Сообщений: 5
aleks2,

а такое:

 select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) )) from dbo.Numbers where n >= 1 and n <=len(@str1)

ругается на
Invalid object name 'dbo.Numbers'.
7 июн 17, 00:01    [20545208]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
NvAriec
aleks2,

а такое:

 select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) )) from dbo.Numbers where n >= 1 and n <=len(@str1)

ругается на
Invalid object name 'dbo.Numbers'.


Я, чтоле, за тебя буду табличку цифирьками заполнять?
7 июн 17, 05:45    [20545329]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
NvAriec
Member

Откуда:
Сообщений: 5
aleks2
NvAriec
aleks2,

а такое:

 select @srtRes = stuff(@srtRes, i, 1, cast( substring(@str1, n, 1) & substring(@str2, n, 1) as char(1) )) from dbo.Numbers where n >= 1 and n <=len(@str1)

ругается на
Invalid object name 'dbo.Numbers'.


Я, чтоле, за тебя буду табличку цифирьками заполнять?

К сожалению
автор
| и & не срабатывают, им нужен целочисленный тип или varbinary (но только для одного из выражений).


Поэтому добавил ещё cast. Получилось вот что:

select @srtRes = stuff(@srtRes, n, 1, cast( cast(substring(@str1, n, 1) as int) & cast(substring(@str2, n, 1) as int) as char(1) )) from dbo.Numbers where n >= 1 and n <=len(@str1)


На выходе NULL.
7 июн 17, 09:49    [20545626]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Табличку циферками это для старичья! Дайошь дарогу маладым!
CREATE FUNCTION dbo.GetIntRange
(
  @Start int
, @End int
)
RETURNS TABLE
AS RETURN
(
  WITH
    NumXML AS
    (
      SELECT CONVERT(xml, REPLICATE('<r/>',  CAST(SQRT(@End-@Start) AS int)+1)) AS x
    )
  , GenRows AS
  (
    SELECT 1 AS t
    FROM
      NumXML n
      CROSS APPLY x.nodes('r') AS r (nn)
  )
  SELECT TOP (@End - @Start + 1)
    ROW_NUMBER() OVER (ORDER BY @Start) + @Start - 1 AS Number
  FROM
    GenRows gr1
    CROSS JOIN GenRows gr2
)
7 июн 17, 09:49    [20545628]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
Cammomile
Табличку циферками это для старичья! Дайошь дарогу маладым!
CREATE FUNCTION dbo.GetIntRange
(
  @Start int
, @End int
)
RETURNS TABLE
AS RETURN
(
  WITH
    NumXML AS
    (
      SELECT CONVERT(xml, REPLICATE('<r/>',  CAST(SQRT(@End-@Start) AS int)+1)) AS x
    )
  , GenRows AS
  (
    SELECT 1 AS t
    FROM
      NumXML n
      CROSS APPLY x.nodes('r') AS r (nn)
  )
  SELECT TOP (@End - @Start + 1)
    ROW_NUMBER() OVER (ORDER BY @Start) + @Start - 1 AS Number
  FROM
    GenRows gr1
    CROSS JOIN GenRows gr2
)


Зачем нужен этот тормоз?
7 июн 17, 10:23    [20545741]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
aleks2
Cammomile
Табличку циферками это для старичья! Дайошь дарогу маладым!
CREATE FUNCTION dbo.GetIntRange
(
  @Start int
, @End int
)
RETURNS TABLE
AS RETURN
(
  WITH
    NumXML AS
    (
      SELECT CONVERT(xml, REPLICATE('<r/>',  CAST(SQRT(@End-@Start) AS int)+1)) AS x
    )
  , GenRows AS
  (
    SELECT 1 AS t
    FROM
      NumXML n
      CROSS APPLY x.nodes('r') AS r (nn)
  )
  SELECT TOP (@End - @Start + 1)
    ROW_NUMBER() OVER (ORDER BY @Start) + @Start - 1 AS Number
  FROM
    GenRows gr1
    CROSS JOIN GenRows gr2
)



Зачем нужен этот тормоз?
Чтобы не стареть!
7 июн 17, 10:25    [20545746]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
NvAriec
aleks2
пропущено...


Я, чтоле, за тебя буду табличку цифирьками заполнять?

К сожалению
автор
| и & не срабатывают, им нужен целочисленный тип или varbinary (но только для одного из выражений).


Поэтому добавил ещё cast. Получилось вот что:

select @srtRes = stuff(@srtRes, n, 1, cast( cast(substring(@str1, n, 1) as int) & cast(substring(@str2, n, 1) as int) as char(1) )) from dbo.Numbers where n >= 1 and n <=len(@str1)


На выходе NULL.


Ну чо ты такой беспомощный?

declare @srtRes char(5), @str1 char(5) = '101010', @str2 char(5) = '01111';

set @srtRes = @str1;

declare @Numbers table(n int primary key);
insert @Numbers values(1), (2), (3), (4), (5);

select @srtRes = stuff(@srtRes, n, 1, cast( cast(substring(@str1, n, 1) as int) & cast(substring(@str2, n, 1) as int) as char(1) )) from @Numbers where n >= 1 and n <=len(@str1)

select @srtRes
7 июн 17, 10:28    [20545760]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
aleks2
Зачем нужен этот тормоз?

а) Чтоб не городить табличку с числами для быстрых тестов и решения задачек.
б) Чтоб заполнить вашу табличку с числами парой лямов записей.
в) Отлично влияет на качество подворотов и густоту дыма из вейпа.
7 июн 17, 10:33    [20545780]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
А вот эту хрень - можно использовать в запросах к таблицам.

declare @srtRes char(5), @str1 char(5) = '101010', @str2 char(5) = '01111';

set @srtRes = @str1;

declare @Numbers table(n int primary key);
insert @Numbers values(1), (2), (3), (4), (5);

select cast( cast(substring(@str1, n, 1) as int) & cast(substring(@str2, n, 1) as int) as char(1) ) from @Numbers where n >= 1 and n <=len(@str1) order by n for xml path('')
7 июн 17, 10:34    [20545786]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
NvAriec
Member

Откуда:
Сообщений: 5
автор
set @srtRes = @str1

Спасибо. Вот этой строки не хватало.

Был бы не беспомощный не просил бы помощи)
7 июн 17, 10:35    [20545793]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
Cammomile
aleks2
Зачем нужен этот тормоз?

а) Чтоб не городить табличку с числами для быстрых тестов и решения задачек.
б) Чтоб заполнить вашу табличку с числами парой лямов записей.
в) Отлично влияет на качество подворотов и густоту дыма из вейпа.


Пусть меня поправят, но это же ты недавно скулил "медленно работает запрос"?
Учись, студент.

ЗЫ. Для тестов есть более вменяемые тормоза.
7 июн 17, 10:36    [20545795]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Из "автогенераторов последовательностей" ЭТОТ самый быстрый. (уж 12 лет как не студент)
7 июн 17, 10:38    [20545799]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
aleks2
Guest
Cammomile
Из "автогенераторов последовательностей" ЭТОТ самый быстрый. (уж 12 лет как не студент)


Маленькая собачка - до старости щенок.
7 июн 17, 10:40    [20545810]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
aleks2
Маленькая собачка - до старости щенок.
aleks2
ЗЫ. Для тестов есть более вменяемые тормоза.

Ну всё, это война. :D

Требую коды более быстрых генераторов циферек в студию! (Назвался гвоздем, забейся в доску. )
7 июн 17, 10:48    [20545845]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Cammomile
Требую коды более быстрых генераторов циферек в студию!
Взять готовые числа из таблицы, возможно, индексированной.
7 июн 17, 10:50    [20545855]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9350
Cammomile
Из "автогенераторов последовательностей" ЭТОТ самый быстрый. (уж 12 лет как не студент)
Было тут мерянее - 16497324. Добавил туда ваш жуткий изврат.
+
use tempdb;
go

create table dbo.Numbers (n int not null primary key);

insert into dbo.Numbers
select top (1000000)
 row_number() over (order by (select 1))
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

create function dbo.[fnNumbers (by a.voronin, modified)]
(
 @n int
)
returns table as
return (
WITH N100 AS 
( -- цифры от 0 до 99
	SELECT 0 AS N
	UNION ALL 
	SELECT N100.N + 1 FROM N100
	WHERE N100.N < 99
) -- цифры от 0 до 9999
select top (@n) row_number() over (order by (select 1)) as n FROM N100 N1, N100 N2, N100 N3
);
go

create function dbo.[fnNumbers (by --__Александр__-- )]
(
 @n int
)
returns table as
return (
        WITH e1(n) AS
        (
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
        ), -- 10
        e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), 
        e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2 AS b), 
        e4(n) AS (SELECT 1 FROM e3 CROSS JOIN e3 AS b),  
        e5(n) AS (SELECT 1 FROM e4 CROSS JOIN e4 AS b)
          SELECT top(@n) n = ROW_NUMBER() OVER (ORDER BY n) FROM e4 ORDER BY n
);
go

CREATE FUNCTION dbo.[fnNumbers (by Cammomile )]
(
  @Start int
, @End int
)
RETURNS TABLE
AS RETURN
(
  WITH
    NumXML AS
    (
      SELECT CONVERT(xml, REPLICATE('<r/>',  CAST(SQRT(@End-@Start) AS int)+1)) AS x
    )
  , GenRows AS
  (
    SELECT 1 AS t
    FROM
      NumXML n
      CROSS APPLY x.nodes('r') AS r (nn)
  )
  SELECT TOP (@End - @Start + 1)
    ROW_NUMBER() OVER (ORDER BY @Start) + @Start - 1 AS n
  FROM
    GenRows gr1
    CROSS JOIN GenRows gr2
);
go

create table #t (id int primary key, q int not null);

insert into #t
select top (10000)
 n, rand(checksum(newid())) * 1000
from
 dbo.Numbers;
go

set statistics /*xml, */io, time on;

select
 count(n.n)
from
 #t t cross apply
 dbo.[fnNumbers (by a.voronin, modified)](t.q) n;

select
 count(n.n)
from
 #t t cross apply
 dbo.[fnNumbers (by --__Александр__-- )](t.q) n;

select
 count(n.n)
from
 #t t cross apply
 dbo.[fnNumbers (by Cammomile )](1, t.q) n;

select
 count(n.n)
from
 #t t join
 dbo.Numbers n on n.n <= t.q

set statistics /*xml, */io, time off;
go

drop function dbo.[fnNumbers (by a.voronin, modified)], dbo.[fnNumbers (by --__Александр__-- )], dbo.[fnNumbers (by Cammomile )];
drop table dbo.Numbers, #t;
go

dbo.[fnNumbers (by a.voronin, modified)]Время ЦП = 796 мс, затраченное время = 811 мс.
dbo.[fnNumbers (by --__Александр__-- )]Время ЦП = 795 мс, затраченное время = 793 мс.
dbo.[fnNumbers (by Cammomile )]Время ЦП = 1670 мс, затраченное время = 1703 мс.
dbo.NumbersВремя ЦП = 374 мс, затраченное время = 372 мс.
7 июн 17, 11:00    [20545903]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А ничего, что у того, с чем сравниваете функционал принципиально другой?
7 июн 17, 11:41    [20546152]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
дбо.числа мы вообще не обсуждаем, я попросил коды генераторов интервалов.

и вот например покажите мне функционал
SELECT * FROM dbo.[fnNumbers (by Cammomile )] (999999, 1000042)
в
dbo.[fnNumbers (by a.voronin, modified)]


Не покажите, потому, что там а) нет возможности делать интервал б)верхняя граница лям, как и у прочих с чем сравнивали.

В общем, ваши тесты, не тесты.
7 июн 17, 11:50    [20546228]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А вот вам тесты, которые реально тесты.
 
 set statistics time on 
SELECT * FROM dbo.[fnNumbers (by a.voronin, modified)] (850000) WHERE n>=  752011 and n <= 848300
 set statistics time off 
 
--   CPU time = 203 ms,  elapsed time = 226 ms.



 set statistics time on 
SELECT * FROM   dbo.[fnNumbers (by Cammomile )] (752011, 848300)
 set statistics time off 
 
 --  CPU time = 78 ms,  elapsed time = 83 ms.


Ну чо, старички, не всегда студенты дураки, а?
7 июн 17, 11:59    [20546276]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
Cammomile,

доо к row_number так тяжело прибавить стартовое значение, просто сил нет.
7 июн 17, 12:01    [20546287]     Ответить | Цитировать Сообщить модератору
 Re: Побитовое сравнение двух строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Владислав Колосов, спасибо за содержательный и ценный ответ. Без него, я бы не смог решить поставленные руководством задачи! Ваш вклад в общее дело форума сложно переоценить, продолжайте в том же духе!
7 июн 17, 12:08    [20546324]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить