Postgresql-11
select tick_time, nano_secs,
concat( to_char(tick_time, 'MMDD HH24:MI:SS.US'),
to_char(nano_secs, '000') )
from ticks
order by tick_time, nano_secs limit 100;
我想像上面那样连接 2 个字符串,但它总是在两个字符串之间添加一个空格字符。
如何防止它这样做?
谢谢!
Postgresql-11
select tick_time, nano_secs,
concat( to_char(tick_time, 'MMDD HH24:MI:SS.US'),
to_char(nano_secs, '000') )
from ticks
order by tick_time, nano_secs limit 100;
我想像上面那样连接 2 个字符串,但它总是在两个字符串之间添加一个空格字符。
如何防止它这样做?
谢谢!
查询生产数据库中的表时遇到问题。一个文本列将与我们在 where 子句中过滤的字符串进行比较,但 postgres 不会选择该行。(我们在 postgres 11.11 上)我们的表设置如下:
(PROD)=> \d names;
Table "public.names"
Column | Type | Collation | Nullable | Default
----------------------+-----------------------------+-----------+----------+---------
name | text | | not null |
processed_name | text | | not null |
name_index | integer | | not null |
when_created | timestamp without time zone | | not null |
Indexes:
"names_pkey" PRIMARY KEY, btree (name, processed_name)
"names_name_index_key" UNIQUE CONSTRAINT, btree (name_index)
"ix_names_name" btree (name)
"ix_names_processed_name" btree (processed_name)
当我们处理名称列表时,我们检查它们是否已经在表中,以防止重复添加和违反主键约束。
但是,在一个名称“Сергей Иванович МЕНЯЙЛО”上,查看该名称是否已存在的查询返回一个空集
,我希望返回具有相同名称的行。但是,当我们尝试在表中插入行时,我们会遇到主键冲突
以下是一些可以更好地解释问题的查询
(PROD)=> SELECT name_index,
name,
name = 'Сергей Иванович МЕНЯЙЛО' names_compare_equal
FROM names where name_index = 75128;
name_index | name | names_compare_equal
----------------------+-------------------------+---------------------
75128 | Сергей Иванович МЕНЯЙЛО | t
(1 row)
但是,在名称列上进行过滤不会选择任何行。
2021-05-24 20:37:41 UTC
(PROD)=> SELECT name_index,
name,
name = 'Сергей Иванович МЕНЯЙЛО'
names_compare_equal
FROM names
WHERE name = 'Сергей Иванович МЕНЯЙЛО';
name_index | name | names_compare_equal
----------------------+------+---------------------
(0 rows)
因此,如果我们尝试插入行,我们会遇到主键冲突:
(PROD)>=> INSERT INTO names (name_index, name, processed_name, when_created)
VALUES (89266, 'Сергей Иванович МЕНЯЙЛО', lower('Сергей Иванович МЕНЯЙЛО'), now());
ERROR: duplicate key value violates unique constraint "names_pkey"
DETAIL: Key (name, processed_name)=(Сергей Иванович МЕНЯЙЛО, сергей иванович меняйло) already exists.
更重要的是,如果我根据行的哈希进行查询,我会得到正确的结果:
(PROD)=> SELECT name_index,
name,
name = 'Сергей Иванович МЕНЯЙЛО' names_compare_equal
FROM names
WHERE md5(name) = md5('Сергей Иванович МЕНЯЙЛО');
name_index | name | names_compare_equal
----------------------+-------------------------+---------------------
75128 | Сергей Иванович МЕНЯЙЛО | t
(1 row)
这只发生在我们的生产数据库上 - 它具有以下编码设置
Name | Owner | Encoding | Collate | Ctype |
----------------+----------------+----------+-------------+-------------+
PROD DB | PROD DB OWNER | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
这对我来说非常莫名其妙,所以关于下一步要检查什么的想法会很有帮助
我最近在一次面试中遇到了一个我无法回答的问题。要求是编写一些 SQL 来获取两个小数点后的前三个数字。
例如: 输入表:
IP address
1.2.3.4.5
11.22.33.44.55
5.6.7.8.9
111.222.333.444
.
.
.
Output table:
IP address
1.2.3
11.22.33
5.6.7
111.222.333
.
.
我最初的方法是使用内置的子字符串。例如:从表中选择 substring(ip,0,5)。但这是一个错误的逻辑,因为它没有考虑 11.22.33 或 111.222.333 等值
如何做到这一点?
我将以下格式字符串存储在文本中(可以是任意数量的列):
col1_source|col1_target;col2_source|col2_target;col3_source|col3_target;...
我试图想出一种优雅的方法来提取和隔离所有 xxx_source 列名和所有 xxx_target 列名,以便我可以将它们存储在变量中并获得以下最终结果:
@Source_Columns = 'col1_source,col2_source,col3_source' @Target_Columns = 'col1_target,col2_target,col3_target'
在一天结束时,我想对我的源列和目标列执行 SELECT 以执行数据比较。
这是我到目前为止所取得的成就,但我发现它太复杂了(使用表值函数):
CREATE FUNCTION [dbo].[UF_miscParseStringToTable]
(
@list nvarchar(MAX)
, @sep varchar(8)
)
RETURNS @ts table
(
[ID] int identity
, [value] nvarchar(MAX)
)
AS
BEGIN
-- Parameters check
if ((@sep is null) or (datalength(@sep) < 1)) return
if ((@list is null) or (@list = '') or (@list = @sep)) return
-- Add path wildcards directly with sep
-- ?worth it?
if (left(@sep, 1) <> '%') set @sep = '%' + @sep
if (right(@sep, 1) <> '%') set @sep = @sep + '%'
-- First first sep
declare @i int
set @i = patindex(@sep, @list)
-- Acc values
while (@i > 0) begin
insert into @ts ([value]) values (rtrim(left(@list, @i - 1)))
set @list = ltrim(right(RTRIM(@list), len(@list) + 3 - (@i + len(@sep) )))
set @i = patindex(@sep, @list)
end
set @list = rtrim(@list)
-- Insert last value, if any
if (@list <> '') insert into @ts (value) values (@list)
return
END
上面的函数基本上采用我的映射字符串并将其转换为表中的列名列表(请参见下面的查询逻辑):
DECLARE @Delim varchar(1) = '|'
DECLARE @Mapping varchar(max) = 'col1_source|col1_target;col2_source|col2_target;col3_source|col3_target'
DECLARE @String varchar(max) = REPLACE(@Mapping,';', @Delim)
SELECT * FROM dbo.UF_miscParseStringToTable(@String, @Delim)
以上结果查询产生下表:
ID| value
1 | col1_source
2 | col1_target
3 | col2_source
4 | col2_target
5 | col3_source
6 | col3_target
我也许可以对列索引进行联接,但是我发现很难隔离源字段和目标字段以便我可以在它们之间执行数据比较。此外,如果不需要的话,我想避免对表执行额外的连接。
以下是所需的结果(以便能够执行以下操作):
SELECT col1_source, col2_source, col3_source FROM mytable;
SELECT col1_target, col2_target, col3_target FROM mytable;
任何帮助或想法都会很棒!
肖恩
大家好!我有一个包含城邦格式地理位置的字段:
该字段跨越大约 230 条记录。我的任务是砍掉每条记录中的最后四个字符。我该怎么做?有任何想法吗?谢谢!
我想看看一个表是否包含给定字符串的任何子字符串。
假设我有一个字符串
somedomain.com
在数据库中我有:
blabladomain.com
testdomain.com
domain.com
我需要进行一个查询,该查询将返回“domain.com”,因为它是“somedomain.com”的子字符串。
我不知道这在 MySQL 中是否可行。
CREATE TABLE `site_core_antispam_banned_domain` (
`domain_id` int(11) NOT NULL AUTO_INCREMENT,
`domain_name` varchar(255) NOT NULL,
PRIMARY KEY (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我只是想知道是否有一种既定的方法来测试字符串是否可以用作不带引号的PostgreSQL 标识符?(不加引号是因为几乎任何字符串都可以是带引号的标识符)。
我问是因为如前一个问题(How to quote qualified table name with format() function?)所示,有时我需要指定一个标识符(例如要创建的表的名称)而不是还存在,作为字符串值 ( text
) 而不是更安全的类型,例如regclass
. 引用字符串/名称可能会出现问题,如此处和其他地方所示。没有引用,它容易受到 SQL 注入的影响。
我想如果一个程序足够难,最终可以编写一个字符串解析函数。只是想检查是否有现有的解决方案。
有关的:
函数 PARSENAME() 是 QUOTENAME() 的对立面吗(sql-server)
让我们考虑这样一个表:
id | name
1 | This is a test sentence
2 | is a sentence TeST
3 | This a IS test sentence
4 | iS a tEst sentence tHis
5 | This a test sentence is
我怎样才能得到所有的行,搜索“是一个句子测试”?
我在用:
SELECT *
FROM table
WHERE name ILIKE '%is%' AND name ILIKE '%a%' AND name ILIKE '%sentence%' AND name ILIKE '%test%'
但这似乎不是最好的方法。