Функция Sql, чтобы сделать существительное во множественном числе - PullRequest
6 голосов
/ 30 января 2012

Есть ли в SQL Server функция, которая меняет существительное с формы единственного числа на множественное число?

Ответы [ 7 ]

4 голосов
/ 30 января 2012

Сам по себе SQL не имеет ничего подобного - но вы можете попробовать использовать .NET PluralizationService , представленный в .NET 4, - ту же функциональность, которую Entity Framework использует для множественного / сингулярного именования таблиц дляИмена объектов.

Вам нужно написать сборку SQL-CLR, чтобы подключиться к службам множественного доступа, но это определенно кажется выполнимой вещью!

4 голосов
/ 30 января 2012

Эта функция не существует в SQL Server.

2 голосов
/ 19 мая 2017
    DECLARE @PluralVersion nvarchar(128) = ''
    DECLARE @TableName nvarchar(128) = 'MyTableName'        
    DECLARE @NounVersions TABLE(Term nvarchar(128) NOT NULL)
    DECLARE @QueryString nvarchar(4000) SET @QueryString = N'FORMSOF(INFLECTIONAL,"' + @TableName + N'")'
    INSERT INTO @NounVersions
    SELECT TOP 10 display_term FROM sys.dm_fts_parser(@QueryString,1033,0,0)
    SELECT TOP 1 @PluralVersion = Term  FROM @NounVersions WHERE Term Not Like '%''%' AND RIGHT(Term,1) = 's'
    SET @PluralVersion = UPPER(LEFT(@PluralVersion,1))+LOWER(SUBSTRING(@PluralVersion,2,LEN(@PluralVersion)))
    SELECT @PluralVersion 

Я знаю, что это старая ветка, но я все равно решил написать.Основываясь на том, что начал Мартин, я расширил его, и пока он работает хорошо.Я бы не сказал, что это идеально.Это используется для множественных имен таблиц, поэтому оно очень контролируемо

2 голосов
/ 30 января 2012
CREATE FUNCTION dbo.Pluralize 
(
    @noun nvarchar(50)
)
RETURNS nvarchar(50)
AS
BEGIN

DECLARE @QueryString nvarchar(4000)
SET @QueryString = N'FORMSOF(INFLECTIONAL,"' + @noun + N'")'
RETURN
(SELECT TOP 1 display_term
FROM sys.dm_fts_parser(@QueryString,1033,0,0))

END
GO

SELECT noun,
       dbo.Pluralize(noun)
FROM   (VALUES('cat'),
              ('mouse'),
              ('goose'),
              ('person'),
              ('man'),
              ('datum')) nouns(noun)  

Возвращает

noun   
------ ------------------------------
cat    cats
mouse  mice
goose  geese
person persons
man    men
datum  data

К сожалению, это просто опирается на наблюдение, что термин расширения TOP 1 для существительного является формой множественного числа. Я сомневаюсь, что это где-то задокументировано.

2 голосов
/ 30 января 2012

Функция не существует в SQL Server, как упоминалось @aF. Единственное место, которое я знаю, существует ли оно в Entity Framework 4+. Объект множественного числа может фактически быть создан и использован .

SQL имеет возможность запускать код CLR - через SQL CLR. Основная проблема заключается в том, что SQL CLR ограничен .NET Framework 3.5. Таким образом, вам нужно написать код .net 4, который будет работать с вашими таблицами. Кроме того, вы можете использовать продукт, такой как Reflector, и перепроектировать версию, совместимую с 3.5, и запускать ее внутри SQL Server.

1 голос
/ 30 января 2012

Вы хотите использовать это для отображения?
Что-то вроде " Ваш поиск вернул 1 результат " / " Ваш поиск вернул 4 результатов "?

Если да, я бы так не поступил.
Найти или написать функцию, которая делает это правильно для всех особых случаев (не говоря уже о нескольких языках),почти невозможно, и хранение каждого необходимого текста один раз в единственном числе и один раз во множественном числе не намного лучше.

На работе я имею дело с несколькими языками и множеством динамически генерируемых предложений, подобных этому, и многоЯ обнаружил, что самым простым решением для управления является полное отсутствие различия форм единственного и множественного числа:

" Количество результатов для этого поиска: 1 "

0 голосов
/ 30 января 2012

Нет, но было бы довольно легко составить таблицу для этого, если у вас есть ограниченный набор слов для проверки.

Пример:

CREATE TABLE dbo.Plurals
( 
  id int IDENTITY,
  singular varchar(100),
  plural varchar(100)
)

INSERT INTO dbo.Plurals
VALUES
('cat', 'cats'),
('goose', 'geese'),
('man', 'men'),
('question', 'questions')

В качестве альтернативы, вы можете сделать таблицу просто исключениями, то есть словами, которые не могут быть множественными с простым добавлением s - тогда вы можете сделать проверку EXISTS для этой таблицы, если ее там нет, тогда добавьтеs и, если это так, ищите множественное число.

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