mysql在where子句动态查询中列值等于搜索值时按大小写排序

bweufnob  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(330)

我有这样的人

------------------------------------------------
|    id    |    full_name    |   first_name    |
------------------------------------------------
|     1    |     aaa bbb     |        aaa      |
|     2    |     bbb ccc     |        bbb      |
|     3    |     ddd aaa     |        ddd      |
|     4    |     aaa fff     |        aaa      |
|     5    |     aaa         |        aaa      |
------------------------------------------------

我尝试搜索aaa,然后根据first name=where子句对结果进行排序,如下所示

SELECT `id`,`full_name`,`first_name` FROM `people`
WHERE `full_name` like '%aaa%'
Order by case 
when full_name = 'aaa' then 1
when first_name like '%aaa' then 2
else 3 end asc

到目前为止,对我来说很好的是,我不想手动设置完整的名称='aaa'和第一个名称,如'%aaa',我想告诉mysql这样的事情

Order by case 
when full_name = "what I searched for in my full_name where clause" then 1
when first_name like '%what I searched for in my full_name where clause' then 2
else 3 end asc
--
-- Table structure for table `people`
--

CREATE TABLE `people` (
  `id` int(10) UNSIGNED NOT NULL,
  `full_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `first_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

--
-- Dumping data for table `people`
--

INSERT INTO `people` (`id`, `full_name`, `first_name`) VALUES
(1, 'aaa bbb', 'aaa'),
(2, 'bbb ccc', 'bbb'),
(3, 'ddd aaa', 'ddd'),
(4, 'aaa fff', 'aaa'),
(5, 'aaa', 'aaa');

编辑假设我只能在查询部分中写入aaa,其中全名(如“%aaa%”)是否有任何方法可以从where子句中读取aaa,而无需过程或设置变量将其按大小写传递给order

z31licg0

z31licg01#

您应该查看用户定义的变量,然后使用 % 作为转义符来检查输入字符串是否包含 % 签字。在此基础上,您可以更改您选择的列 ORDER BY .
下面我举一个例子。

SET @input_str1:='%abc%';
SET @input_str2:='abc';

SELECT
  @input_str1,
  @input_str2,
  CASE WHEN @input_str1 LIKE '%|%%' escape '|' THEN 1 ELSE 0 END order_by_1,
  CASE WHEN @input_str2 LIKE '%|%%' escape '|' THEN 1 ELSE 0 END order_by_2
;

我定义了两个字符串 input_str1 包含 % 以及 input_str2 不包含 % 符号。然后,在我的select查询中,我选择: input_str1 作为第一列 input_str2 作为第二列
第三列包含 1 如果 input_str1 包含 % 否则 0 第四列包含 1 如果 input_str2 包含 % 否则 0 因此,输出为:

%abc%      abc      1       0

如果您想根据找到的匹配项排序(这还不完全清楚,但我怀疑您正试图这样做),那么您可以类似地创建多个标志并使用这些标志来决定排序依据。
或者,如果您只是想根据输入字符串的内容来确定顺序,那么可以使用我上面介绍的概念,创建另一个用户定义的变量 order_by_column 根据输入字符串是否包含 % 符号与否。

SET @order_by_column =  CASE WHEN @input_str LIKE '%|%%' escape '|' THEN 'first_name' ELSE 'full_name' END;

.. 然后使用 @order_by_column 来整理你的结果。

c6ubokkw

c6ubokkw2#

我的解释是你不想改变 aaa 第三部分,如果需要更改搜索参数。
创建过程并使用动态查询。

create procedure sort(search varchar(15))
begin
    set @s := 
    concat( 'SELECT `id`,`full_name`,`first_name` FROM `people`',
            'WHERE `full_name` like \'%', search, '%\' ',
            'Order by case ', 
            'when full_name = \'', search, '\' then 1 '
            'when first_name like \'%' , search, '\' then 2'
            'else 3 end asc');

    prepare query from @s;
    execute query;
    deallocate prepare query;
end$$

相关问题