SQL выбрать отдельные строки, где элемент похож на% - PullRequest
1 голос
/ 14 марта 2012

Прямо сейчас я использую страницу asp, чтобы пройтись по большой таблице и посмотреть, есть ли в одной из строк хотя бы один элемент, где она похожа на '1D%', однако это занимает много времени для этого нужно не только сделать «1D», но и как минимум 30 других лайков. Есть ли SQL-запрос, который может сделать это в таблицу

спасибо

Хорошо, ребята, чтобы вы лучше поняли, что я пытаюсь сделать, я бы хотел, чтобы этот запрос выполнялся намного быстрее

sql2 = "SELECT code FROM products "
set bs = MyConn.Execute(sql2)
    do until bs.eof
        if not bs.eof then
            sql3 = "SELECT code FROM brand"
            set ns = MyConn.Execute(sql3)
                do until ns.eof
                    if not ns.eof then
                        sql = "SELECT TOP 1 sku, MID(sku, 1, 5) AS brand FROM catalog WHERE sku LIKE '"&bs.fields("code")&ns.fields("code")&"%' "
                        set rs = MyConn.Execute(sql)
                        do until rs.eof
                            if not rs.eof then
                                response.write(rs.fields("brand")&"<br>")
                            end if
                        rs.movenext
                        loop
                        set rs = Nothing
                    end if
                ns.movenext
                loop
            set ns = nothing
        end if
    bs.movenext
    loop
set bs = Nothing

вывод примерно такой 1DZOO 1FBAH 1FDRE 1FGRA 1FRIV 1FSCS 1FSEC 1FSUR 1CALI

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Вы можете попробовать что-то вроде

SELECT ... WHERE SUBSTRING(yourfield, 0, 2) IN ('1D', '2D', '3D', ...)
0 голосов
/ 15 марта 2012

Еще одна вещь, которую следует учитывать, - это добавить столбцы Indexed Computed в таблицу каталога, это позволит легко (и индексировать) запрашивать и, что более важно, объединяться.Поскольку SUBSTRING по своей природе является детерминированным (вычисляемые столбцы могут быть проиндексированы, только если они являются детерминированными), эти столбцы будут одинаково быстрыми после индексации (в пределах разумного), например:

CREATE TABLE [dbo].[tbl_Example](
    [ID] [int] NULL,
    [SKU] [varchar](50) NULL,
    [Computed_Product]  AS (substring([SKU],(1),(2))),
    [Computed_Brand]  AS (substring([SKU],(3),(2)))
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
CREATE NONCLUSTERED INDEX [IX_Computed_BrandCode] ON [dbo].[tbl_Example] 
(
    [Computed_Brand] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_ComputedProductCode] ON [dbo].[tbl_Example] 
(
    [Computed_Product] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (1, N'ASdasdasdL')
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (2, N'1231f2efwdsfas')
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (3, N'sdf23re2fwdf')
0 голосов
/ 14 марта 2012

Вы имеете в виду, что сначала вы загружаете все данные в набор записей, а затем зацикливаете их в ASP для фильтрации?Не удивительно, что это медленно!SQL будет выглядеть примерно так:

SELECT
   Col1, Col2
FROM
   Table1
WHERE
   SearchCol1 LIKE '1D%'
   OR
   SearchCol2 LIKE '1D%'

Это также не будет быстрым, но будет намного быстрее, чем у вас сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...